带你玩转LCD12864
单片机源程序如下:
- #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(); //延时300ms
- void Delay2ms(void); //延时20ms
- void Init(void); //初始化
- void OnOff(uchar onoff); //屏幕开关
- void Clear(void); //清屏
- void Write_Com(uchar com); //写命令
- void Write_Data(uchar Data); //写数据
- void Select_Screen(uchar cs); //选择左右半屏
- void Set_Page(uchar page); //页选择函数
- void Set_Row(uchar row); //行选择函数
- void Set_Rank(uchar rank); //列选择函数
- 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数字显示
- void Show_Menu(bit sel,uchar screen,uchar page,uchar *menu); //菜单显示
- //延时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();
-
- }
- //屏幕开关
- void OnOff(uchar onoff)
- {
- onoff = onoff | 0x3E; //0关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;
- }
- //写数据
- void Write_Data(uchar Data)
- {
- RS = 1;RW = 0;EN = 0;
- DATABUS=Data;
- EN = 1;
- Delay2ms();
- EN = 0;
- }
-
- //屏幕选择函数
- 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; //单击信号
- bit D_Click;
- bit Clock_Wise; //顺时针信号
- bit A_Clock_Wise; //逆时针信号
- 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*/
-
-
-
- //判断单击信号
- 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;//顺时针
- if((Last_PIN3_status)==1&&(Current_PIN3_status==0))
- A_Clock_Wise = 1;//逆时针
- }
- }
- //选择菜单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; //下降沿触发中断
- 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)//逆时针旋转
- {
- 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;}//顺时针旋转break 选中1
- if(A_Clock_Wise) //逆时针旋转
- {
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有代码51hei提供下载:
LCD.rar
(352.51 KB, 下载次数: 33)
|