|
帶你玩轉(zhuǎn)LCD12864
單片機(jī)源程序如下:
- #include <reg51.h>
- #include <stdio.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define DATABUS P1
- #endif
- sbit RS = P2^0;
- sbit RW = P2^1;
- sbit EN = P2^2;
- sbit CS1 = P2^4;
- sbit CS2 = P2^5;
- sbit PIN4 =P3^0;
- sbit PIN3 =P3^1;
- sbit PIN1 =P3^2;
- void delay300ms(); //延時(shí)300ms
- void Delay2ms(void); //延時(shí)20ms
- void Init(void); //初始化
- void OnOff(uchar onoff); //屏幕開關(guān)
- void Clear(void); //清屏
- void Write_Com(uchar com); //寫命令
- void Write_Data(uchar Data); //寫數(shù)據(jù)
- void Select_Screen(uchar cs); //選擇左右半屏
- void Set_Page(uchar page); //頁選擇函數(shù)
- void Set_Row(uchar row); //行選擇函數(shù)
- void Set_Rank(uchar rank); //列選擇函數(shù)
- void Show_Im_128x64(uchar *Im); //128x64圖像顯示
- void Show_Im_64x64(uchar screen,uchar *Im); //64x64圖像顯示
- void Show_ImWo_32x32(uchar screen,uchar page,uchar rank,uchar *ImWo); //32x32字符顯示
- void Show_ImWo_16x16(uchar screen,uchar page,uchar rank,uchar *ImWo); //16x16字符顯示
- void Show_Num_16x64(uchar screen,uchar page,uchar *Num); //16x64數(shù)字顯示
- void Show_Menu(bit sel,uchar screen,uchar page,uchar *menu); //菜單顯示
- //延時(shí)2ms
- void Delay2ms()
- {
- uchar i, j;
- i = 1;
- j = 5;
- do
- {
- while (--j);
- } while (--i);
- }
- //300ms
- void delay300ms()
- {
- unsigned char i, j, k;
- _nop_();
- i = 3;
- j = 26;
- k = 223;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- //初始化屏幕
- void Init(void)
- {
- Select_Screen(0);
- OnOff(1);
- Clear();
-
- Select_Screen(1);
- OnOff(1);
- Clear();
-
- }
- //屏幕開關(guān)
- void OnOff(uchar onoff)
- {
- onoff = onoff | 0x3E; //0關(guān)1開
- Write_Com(onoff);
- }
- //清屏
- void Clear(void)
- {
- uchar i,j;
- Set_Page(0);
- Set_Row (0);
- Set_Rank(0);
- for(i = 0;i < 8;i++){
- Set_Page(i);
- for(j = 0;j < 64;j++){
- Write_Data(0x00);
- }
- }
- }
- //寫命令
- void Write_Com(uchar com)
- {
- RS = 0;RW = 0;EN = 0;
- DATABUS = com;
- EN = 1;
- Delay2ms();
- EN = 0;
- }
- //寫數(shù)據(jù)
- void Write_Data(uchar Data)
- {
- RS = 1;RW = 0;EN = 0;
- DATABUS=Data;
- EN = 1;
- Delay2ms();
- EN = 0;
- }
-
- //屏幕選擇函數(shù)
- void Select_Screen(uchar cs)
- {
- switch(cs){
- case 0:CS1 = 1;CS2 = 0;break; //左半屏
- case 1:CS1 = 0;CS2 = 1;break; //右半屏
- default: CS1 = 1;CS2 = 0;break;
- }
- }
- void Set_Page(uchar page)
- {
- page = 0xB8 | page;
- Write_Com(page);
- }
- void Set_Row(uchar row)
- {
- row = 0xC0 | row;
- Write_Com(row);
- }
- void Set_Rank(uchar rank)
- {
- rank = rank & 0x3F;
- rank = rank | 0x40;
- Write_Com(rank);
- }
- //128x64圖像
- void Show_Im_128x64(uchar *Im)
- {
- uchar i,j;
- Select_Screen(0); //左半
- for(i = 0;i < 8;i++){
- Set_Page(i);
- for(j = 0;j < 64;j++){
- Write_Data(Im[i*128+j]);
- }
- }
-
- Select_Screen(1); //右半
- for(i = 0;i < 8;i++){
- Set_Page(i);
- for(j = 64;j < 128;j++){
- Write_Data(Im[i*128+j]);
- }
- }
-
- }
- void Show_Im_128x32(uchar *Im)
- {
- uchar i,j;
- Select_Screen(0); //左半
- for(i = 0;i < 4;i++){
- Set_Page(i);
- for(j = 0;j < 64;j++){
- Write_Data(Im[i*128+j]);
- }
- }
-
- Select_Screen(1); //右半
- for(i = 0;i < 4;i++){
- Set_Page(i);
- for(j = 64;j < 128;j++){
- Write_Data(Im[i*128+j]);
- }
- }
-
- }
- //64x64
- void Show_Im_64x64(uchar screen,uchar *Im)
- {
- uchar i, j;
- Select_Screen(screen);
- for(i = 0;i < 8;i++){
- Set_Page(i);
- for(j = 0;j < 64;j++){
- Write_Data(Im[i*64+j]);
- }
- }
- }
- //32x32
- void Show_ImWo_32x32(uchar screen,uchar page,uchar rank,uchar *ImWo)
- {
- uchar i, j;
- //Init();
- Select_Screen(screen);
- for(i = 0;i < 4;i++){
- Set_Page(page+i);
- Set_Rank(rank);
- for(j = 0;j < 32;j++){
- Write_Data(ImWo[i*32+j]);
- }
- }
- }
- //16x16
- void Show_ImWo_16x16(uchar screen,uchar page,uchar rank,uchar *ImWo)
- {
- uchar i, j;
- //Init();
- Select_Screen(screen);
- for(i = 0;i < 2;i++){
- Set_Page(page+i);
- Set_Rank(rank);
- for(j = 0;j < 16;j++){
- Write_Data(ImWo[i*16+j]);
- }
- }
- }
- //16x64
- void Show_Num_16x64(uchar screen,uchar page,uchar *Num)
- {
- uchar i, j;
- Select_Screen(screen);
- Set_Page(page);
- for(i = 0;i < 8;i++){
- for(j = 0;j < 8;j++){
- Write_Data(Num[16*i+j]);
- }
- };
- Set_Page(page+1);
- for(i = 0;i < 8;i++){
- for(j = 0;j < 8;j++){
- Write_Data(Num[16*i+j+8]);
- }
- };
- }
- //菜單
- void Show_Menu(bit sel,uchar screen,uchar page,uchar *menu)
- {
- uchar n;
- if(sel) n=128;
- else n=0;
-
- Show_ImWo_16x16(screen,page,0,&menu[0+n]);
- Show_ImWo_16x16(screen,page,16,&menu[32+n]);
- Show_ImWo_16x16(screen,page,32,&menu[64+n]);
- Show_ImWo_16x16(screen,page,48,&menu[96+n]);
- }
- bit Click; //單擊信號(hào)
- bit D_Click;
- bit Clock_Wise; //順時(shí)針信號(hào)
- bit A_Clock_Wise; //逆時(shí)針信號(hào)
- uchar sta=0;
- //"熊貓",128*64
- uchar code panda[] =
- {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0xFF,0xFF,0xFF,0x03,0xAB,0xAB,0xA9,0xAA,0xAB,0xAB,0xAB,0x03,0xFF,0xFF,0xFF,0xFF,
- 0xBF,0xCF,0xFF,0xFC,0xC6,0xBE,0xBE,0xBA,0xA6,0xBE,0xBE,0x8C,0xFF,0xF7,0xCF,0xFF};/*"?",3*/
-
-
-
- //判斷單擊信號(hào)
- void Click_Flag()
- {
- uchar sta[3]={0,0,0};
-
- if(PIN4==0){
- Delay2ms(); //????(???????,??????????)
- if(PIN4==0);sta[0]=1; //?????
- Delay2ms();
- if(PIN4==1) sta[1]=1; //????
- Delay2ms();
- if(PIN4==0) sta[2]=1; //?????*/
-
- Click = sta[0]; //???????
-
- D_Click = sta[0]&sta[1]&sta[2]; //???????
-
- while(!PIN4); //????(??????CPU????,???)
- }
- }
- //中斷
- void inter() interrupt 0
- { unsigned char Current_PIN3_status,flag,Last_PIN3_status;
- Last_PIN3_status = PIN3;
- while(!PIN1)
- {
- Current_PIN3_status = PIN3;
- flag = 1;
- }
- if(flag == 1)
- {
- flag = 0;
- if((Last_PIN3_status)==0&&(Current_PIN3_status==1))
- Clock_Wise = 1;//順時(shí)針
- if((Last_PIN3_status)==1&&(Current_PIN3_status==0))
- A_Clock_Wise = 1;//逆時(shí)針
- }
- }
- //選擇菜單1
- void show_menu1 ()
- {
- Clock_Wise=0;//???????
- A_Clock_Wise=0;//???????
- Show_Menu(1,0,0,menu1);
- Show_Menu(0,0,2,menu2);
- Show_Menu(0,0,4,menu3);
-
- }
- //選擇菜單2
- void show_menu2 ()
- {
- Clock_Wise=0;
- A_Clock_Wise=0;
- Show_Menu(0,0,0,menu1);
- Show_Menu(1,0,2,menu2);
- Show_Menu(0,0,4,menu3);
-
- }
- //選擇菜單3
- void show_menu3 ()
- {
- Clock_Wise=0;
- A_Clock_Wise=0;
- Show_Menu(0,0,0,menu1);
- Show_Menu(0,0,2,menu2);
- Show_Menu(1,0,4,menu3);
- }
- void show_menu1_1 ()
- {
- Clock_Wise=0;
- A_Clock_Wise=0;
- Show_Menu(1,1,0,menu1_1);
- Show_Menu(0,1,2,menu1_2);
- Show_Menu(0,1,4,menu1_3);
-
- }
- void show_menu1_2 ()
- {
- Clock_Wise=0;
- A_Clock_Wise=0;
- Show_Menu(0,1,0,menu1_1);
- Show_Menu(1,1,2,menu1_2);
- Show_Menu(0,1,4,menu1_3);
-
-
- }
- void show_menu1_3 ()
- {
- Clock_Wise=0;
- A_Clock_Wise=0;
- Show_Menu(0,1,0,menu1_1);
- Show_Menu(0,1,2,menu1_2);
- Show_Menu(1,1,4,menu1_3);
-
- }
-
- void main()
- {
- bit toHead;
-
- IE = 0X81; //總中斷
- IT0 = 1; //下降沿觸發(fā)中斷
- Init();
- while(1)
- {
- Show_Im_128x64(panda); //歡迎界面
- // Delay300ms();
- // Show_ImWo_32x32(1,0,0,wang);
- // Show_ImWo_32x32(1,0,32,hao);
- // Show_Num_16x64(1,5,stunum);
- Click_Flag(); //判斷單擊
- if(Click)
- {
- Click=0;
- Select_Screen(0);Clear();
- Select_Screen(1);Clear();
- while(1)
- {
- if(D_Click)break;
- A_Clock_Wise=0;
- Clock_Wise=0;
- toHead=0;
- show_menu1 ();//初始選中菜單1
- if(A_Clock_Wise)//逆時(shí)針旋轉(zhuǎn)
- {
- A_Clock_Wise=0;
- Clock_Wise=0;
- while(1)
- {
- if(toHead)break;
- show_menu3 ();//選中菜單3
- Click_Flag();
- if(Click) while(1){Show_Im_128x64(name);delay300ms();delay300ms();delay300ms();if(A_Clock_Wise){A_Clock_Wise=0;Click=0;Select_Screen(0);Clear();
- Select_Screen(1);Clear();break;}
- }
- if(Clock_Wise){Clock_Wise = 0;A_Clock_Wise=0;break;}//順時(shí)針旋轉(zhuǎn)break 選中1
- if(A_Clock_Wise) //逆時(shí)針旋轉(zhuǎn)
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有代碼51hei提供下載:
LCD.rar
(352.51 KB, 下載次數(shù): 33)
2021-7-11 21:48 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|