找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 584|回复: 3
打印 上一主题 下一主题
收起左侧

LCD12864+51单片机仿真,为啥12864的全部引脚一起闪烁?

[复制链接]
跳转到指定楼层
楼主
ID:1070075 发表于 2023-12-14 17:40 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#include <reg51.h>//应该是清屏失败了#define uchar unsigned char #define uint unsigned int#define lcdrow 0xc0                        //起始列#define lcdpage 0xb8                 //起始页#define lcdcolumn 0x40                  //起始列//#define c_page_max 0x08                //页数最大值  8//#define c_column_max 0x40              //列数最大值  64#define bus P0sbit rst=P2^0;sbit e=P2^2;sbit rw=P2^3;sbit rs=P2^4;sbit cs1=P2^5;sbit cs2=P2^6;void delayms(uint);void delayus10(void);void select(uchar);void send_cmd(ucahr);void send_data(uchar);void clear_screen(void);void initial(void); void display_zf(uchar,uchar,uchar,uchar); void display_hz(uchar,uchar,uchar,uchar); void display(void);void CheckState(void);uchar code table_zf[]={// P0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//R0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//00xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//T0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,// E0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//U0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//文字:S0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00};//汉字表//宋体12;此字体下对应的点阵为:宽X高=16X16//取模方式:纵向取模下高位,从上到下,从左到右取模uchar code table_hz[]={//文字:电0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00,0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00,//文字:子0x00,0x00,0x02,0x02,0x02,0x02,0x02,0xE2,0x12,0x0A,0x06,0x02,0x00,0x80,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x41,0x81,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,  //设        0x40,0x41,0xCE,0x04,0x00,0x80,0x40,0xBE,0x82,0x82,0x82,0xBE,0xC0,0x40,0x40,0x00,0x00,0x00,0x7F,0x20,0x90,0x80,0x40,0x43,0x2C,0x10,0x10,0x2C,0x43,0xC0,0x40,0x00,//文字:计0x20,0x21,0x2E,0xE4,0x00,0x00,0x20,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x7F,0x20,0x10,0x08,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,//文字:与0x00,0x00,0x00,0x00,0x7E,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0xCC,0x08,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x24,0x46,0x44,0x20,0x1F,0x00,0x00,//文字:创0x40,0x20,0xD0,0x4C,0x43,0x44,0x48,0xD8,0x30,0x10,0x00,0xFC,0x00,0x00,0xFF,0x00,0x00,0x00,0x3F,0x40,0x40,0x42,0x44,0x43,0x78,0x00,0x00,0x07,0x20,0x40,0x3F,0x00,//文字:新0x20,0x24,0x2C,0x35,0xE6,0x34,0x2C,0x24,0x00,0xFC,0x24,0x24,0xE2,0x22,0x22,0x00,0x21,0x11,0x4D,0x81,0x7F,0x05,0x59,0x21,0x18,0x07,0x00,0x00,0xFF,0x00,0x00,0x00,//文字:的0x00,0xF8,0x8C,0x8B,0x88,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x00,0x7F,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x03,0x26,0x40,0x20,0x1F,0x00,0x00,//文字:最0x40,0x40,0xC0,0x5F,0x55,0x55,0xD5,0x55,0x55,0x55,0x55,0x5F,0x40,0x40,0x40,0x00,0x20,0x20,0x3F,0x15,0x15,0x15,0xFF,0x48,0x23,0x15,0x09,0x15,0x23,0x61,0x20,0x00,//文字:佳0x40,0x20,0xF0,0x1C,0x47,0x4A,0x48,0x48,0x48,0xFF,0x48,0x48,0x4C,0x68,0x40,0x00,0x00,0x00,0xFF,0x00,0x40,0x44,0x44,0x44,0x44,0x7F,0x44,0x44,0x46,0x64,0x40,0x00,//文字:平0x00,0x01,0x05,0x09,0x71,0x21,0x01,0xFF,0x01,0x41,0x21,0x1D,0x09,0x01,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,//文字:台0x00,0x00,0x40,0x60,0x50,0x48,0x44,0x63,0x22,0x20,0x20,0x28,0x70,0x20,0x00,0x00,0x00,0x00,0x00,0x7F,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x7F,0x00,0x00,0x00,0x00};void mian(){        CheckState();        initial();        display();        clear_screen();        display();        while(1);}void CheckState(void)                //状态检查,LCD是否忙?{   rs=0;   rw=1;         e=1;                           //仅当第7位为0时才可操作(判别busy信号)    while((bus&0x80)==0x80);    e=0;}void delayus10(void){        uchar i=5;        while(--i);}void delayms(uint j){        uchar i=250;        for(;j>0;j--)        {                while(--i);                i=249;                while(--i);i=250;}}//屏幕选择-Cs=0选择双屏,cs=1选择左半屏,cs=2选择右半屏        //void select(uchar cs)void select(uchar cs){  if(cs==0) cs1=0,cs2=0;  else if(cs==1) cs1=0,cs2=1;        else cs1=1,cs2=0;}void send_cmd(uchar cmd)             //写命令函数{        CheckState();        rs=0;rw=0;bus=cmd;delayus10();e=1;e=0;}void send_data(uchar dat)                 //写数据函数{        CheckState();  rs=1;rw=0;bus=dat;delayus10();e=1;e=0;}void clear_screen(void)        //清屏函数{   uchar c_page,c_column;   select(0);   for(c_page=0;c_page<0x08;c_page++)   {     send_cmd(c_page+lcdpage);     send_cmd(lcdcolumn);     for(c_column=0;c_column<0x40;c_column++)     {        send_data(0x00);           }    }}void initial()       //LCD初始化{        CheckState();        select(0);        rst=0;delayms(10);rst=1;    clear_screen();  send_cmd(lcdrow);        send_cmd(lcdcolumn);        send_cmd(lcdpage);        send_cmd(0x3f);}//写字符,c_page为当前页,c_column为当前列,num为字符数,//offset为所取字符在显示缓冲区中的偏移单位void display_zf(uchar c_page,uchar c_column,uchar num,uchar offset){uchar c1,c2,c3;    //这里将uchar改为了uintfor(c1=0;c1<num;c1++){  for(c2=0;c2<2;c2++)        {                        for(c3=0;c3<8;c3++)    {        send_cmd(lcdpage+c_page+c2);     //lcdpage是起始页,一页八行,一共8页        send_cmd(lcdcolumn+c_column+c1*8+c3);   //lcdolumn是起始列,加当前列,再加              send_data(table_zf[(c1+offset)*16+c2*8+c3]); //     }  }}}//写汉字,C_page为当前页,C_
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1070075 发表于 2023-12-14 17:41 来自手机 | 只看该作者
/写字符,c_page为当前页,c_column为当前列,num为字符数,//offset为所取字符在显示缓冲区中的偏移单位void display_zf(uchar c_page,uchar c_column,uchar num,uchar offset){uchar c1,c2,c3;    //这里将uchar改为了uintfor(c1=0;c1<num;c1++){  for(c2=0;c2<2;c2++)        {                        for(c3=0;c3<8;c3++)    {        send_cmd(lcdpage+c_page+c2);     //lcdpage是起始页,一页八行,一共8页        send_cmd(lcdcolumn+c_column+c1*8+c3);   //lcdolumn是起始列,加当前列,再加              send_data(table_zf[(c1+offset)*16+c2*8+c3]); //     }  }}}//写汉字,C_page为当前页,C__column为当前列,num为字符数,//offset为所取汉字在显示缓冲区中的偏移单位void display_hz(uchar c_page,uchar c_column,uchar num,uchar offset){uchar c1,c2,c3;for(c1=0;c1<num;c1++){  for(c2=0;c2<2;c2++)     {     for(c3=0;c3<16;c3++)       {         send_cmd(lcdpage+c_page+c2);         send_cmd(lcdcolumn+c_column+c1*16+c3);         send_data(table_hz[(c1+offset)*32+c2*16+c3]);                         }                 }         } }void display(void){  select(1);  display_zf(0,40,3,0);        display_hz(2,0,4,0);        display_hz(4,32,2,8);        delayus10();        select(2);  display_zf(0,0,4,3);        display_hz(2,0,4,4);        display_hz(4,0,2,10);}

}538UB4TVJ%EHZE@ZCCRS$A.png (80.16 KB, 下载次数: 4)

}538UB4TVJ%EHZE@ZCCRS$A.png
回复

使用道具 举报

板凳
ID:61140 发表于 2023-12-17 23:13 | 只看该作者
仿真中不需要判忙,因为在仿真中元件都是理想状态。只在实际应用中才判忙。
把判忙去掉应该就可以了。
回复

使用道具 举报

地板
ID:1070075 发表于 2023-12-31 15:34 | 只看该作者
xiaoyuxinke 发表于 2023-12-17 23:13
仿真中不需要判忙,因为在仿真中元件都是理想状态。只在实际应用中才判忙。
把判忙去掉应该就可以了。

好的,谢谢。我找到原因是,就是main写成了mian.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表