现在protues的LCD可以正常运行显示了。这里的代码可以实现LCD显示的驱动// 按键引脚定义匹配你的原理图sbit KEY_SET P1^0; // 进入设置sbit KEY_HOUR P1^1; // 调时sbit KEY_MIN P1^2; // 调分sbit KEY_SEC P1^3; // 调秒sbit KEY_OK P1^4; // 确认退出sbit BEEP P1^7; // 蜂鸣器暂存下一步修改思路 思路代码都在下面现在已经完成上电响铃单次闹钟响铃闹钟时间保存时间显示修改保存功能sbit BEEP P1^7; // 无源蜂鸣器一定要按下确认闹钟时间才会被保存#include reg51.h // LCD???? sbit RS P2^2; sbit RW P2^1; sbit EN P2^0; sbit CS1 P2^4; sbit CS2 P2^3; // ???? sbit KEY_SET P1^0; sbit KEY_HOUR P1^1; sbit KEY_MIN P1^2; sbit KEY_SEC P1^3; sbit KEY_OK P1^4; // ????? sbit BEEP P1^7; // ???? void delay(unsigned int ms) { unsigned int i, j; for(i 0; i ms; i) for(j 0; j 123; j); } // ??? void WriteCmd(unsigned char cmd) { RS 0; RW 0; P0 cmd; EN 1; delay(1); EN 0; } // ??? void WriteData(unsigned char dat) { RS 1; RW 0; P0 dat; EN 1; delay(1); EN 0; } // LCD??? void LCD_Init() { delay(50); CS1 1; CS2 1; WriteCmd(0x3F); delay(5); WriteCmd(0xC0); delay(5); } // ?? void LCD_Clear() { unsigned char page, col; CS1 1; CS2 0; for(page 0; page 8; page) { WriteCmd(0xB8 | page); WriteCmd(0x40); for(col 0; col 64; col) WriteData(0x00); } CS1 0; CS2 1; for(page 0; page 8; page) { WriteCmd(0xB8 | page); WriteCmd(0x40); for(col 0; col 64; col) WriteData(0x00); } CS1 1; CS2 1; } // ???????? void BeepOnce() { unsigned char i; for(i 0; i 200; i) { BEEP ~BEEP; delay(1); } BEEP 1; } // ?????? void ClearTitleArea() { unsigned char page, col; CS1 1; CS2 0; for(page 0; page 2; page) { WriteCmd(0xB8 | page); WriteCmd(0x40); for(col 0; col 64; col) WriteData(0x00); } CS1 0; CS2 1; for(page 0; page 2; page) { WriteCmd(0xB8 | page); WriteCmd(0x40); for(col 0; col 64; col) WriteData(0x00); } CS1 1; CS2 1; } // ?????? void ClearBottomArea() { unsigned char page, col; CS1 1; CS2 0; for(page 6; page 8; page) { WriteCmd(0xB8 | page); WriteCmd(0x40); for(col 0; col 64; col) WriteData(0x00); } CS1 0; CS2 1; for(page 6; page 8; page) { WriteCmd(0xB8 | page); WriteCmd(0x40); for(col 0; col 64; col) WriteData(0x00); } CS1 1; CS2 1; } // ???? code unsigned char Num0[] {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00}; code unsigned char Num1[] {0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00}; code unsigned char Num2[] {0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00}; code unsigned char Num3[] {0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00}; code unsigned char Num4[] {0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24}; code unsigned char Num5[] {0x00,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x20,0x20,0x20,0x11,0x0E,0x00}; code unsigned char Num6[] {0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00}; code unsigned char Num7[] {0x00,0x18,0x08,0x08,0x88,0x68,0x18,0x00,0x00,0x00,0x00,0x3E,0x01,0x00,0x00,0x00}; code unsigned char Num8[] {0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00}; code unsigned char Num9[] {0x00,0xF0,0x08,0x08,0x08,0x10,0xE0,0x00,0x00,0x01,0x12,0x22,0x22,0x11,0x0F,0x00}; code unsigned char Colon[] {0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00}; // ???? code unsigned char ChineseZhu[] { 0x00,0x08,0x08,0x08, 0x08,0x08,0x09,0xFA, 0x08,0x08,0x08,0x08, 0x08,0x08,0x00,0x00, 0x40,0x40,0x41,0x41, 0x41,0x41,0x41,0x7F, 0x41,0x41,0x41,0x41, 0x41,0x40,0x40,0x00 }; code unsigned char ChineseQi[] { 0xE0,0xF0,0xDF,0x7E,0x88,0x08,0x78,0xD8, 0xFE,0xFF,0xE0,0x00,0x00,0x00,0x40,0x80, 0x03,0x04,0xC8,0x39,0x09,0x09,0x08,0x08, 0xF8,0xF5,0xF3,0xF0,0xE0,0xE0,0xF0,0xCF }; code unsigned char *NumTable[10] {Num0, Num1, Num2, Num3, Num4, Num5, Num6, Num7, Num8, Num9}; // ???? void ShowNum(unsigned char page, unsigned char col, unsigned char num) { unsigned char i; unsigned char *p; if(num 9) return; p NumTable[num]; if(col 64) { CS1 1; CS2 0; WriteCmd(0xB8 | page); WriteCmd(0x40 | col); for(i 0; i 8; i) WriteData(p[i]); WriteCmd(0xB8 | (page 1)); WriteCmd(0x40 | col); for(i 8; i 16; i) WriteData(p[i]); } else { CS1 0; CS2 1; WriteCmd(0xB8 | page); WriteCmd(0x40 | (col - 64)); for(i 0; i 8; i) WriteData(p[i]); WriteCmd(0xB8 | (page 1)); WriteCmd(0x40 | (col - 64)); for(i 8; i 16; i) WriteData(p[i]); } CS1 1; CS2 1; } // ???? void ShowColon(unsigned char page, unsigned char col) { unsigned char i; if(col 64) { CS1 1; CS2 0; WriteCmd(0xB8 | page); WriteCmd(0x40 | col); for(i 0; i 8; i) WriteData(Colon[i]); WriteCmd(0xB8 | (page 1)); WriteCmd(0x40 | col); for(i 8; i 16; i) WriteData(Colon[i]); } else { CS1 0; CS2 1; WriteCmd(0xB8 | page); WriteCmd(0x40 | (col - 64)); for(i 0; i 8; i) WriteData(Colon[i]); WriteCmd(0xB8 | (page 1)); WriteCmd(0x40 | (col - 64)); for(i 8; i 16; i) WriteData(Colon[i]); } CS1 1; CS2 1; } // ???? void ShowChinese(unsigned char page, unsigned char col, unsigned char *ch) { unsigned char i; if(col 48) { CS1 1; CS2 0; WriteCmd(0xB8 | page); WriteCmd(0x40 | col); for(i 0; i 16; i) WriteData(ch[i]); WriteCmd(0xB8 | (page 1)); WriteCmd(0x40 | col); for(i 16; i 32; i) WriteData(ch[i]); } else if(col 64) { CS1 0; CS2 1; WriteCmd(0xB8 | page); WriteCmd(0x40 | (col - 64)); for(i 0; i 16; i) WriteData(ch[i]); WriteCmd(0xB8 | (page 1)); WriteCmd(0x40 | (col - 64)); for(i 16; i 32; i) WriteData(ch[i]); } CS1 1; CS2 1; } // ???? void ShowQi() { ShowChinese(0, 64, ChineseQi); } // ???? unsigned char hour 10; unsigned char min 30; unsigned char sec 45; unsigned int timer_cnt 0; unsigned char last_min 255; // ????????? // ???? unsigned char alarm_hour 8; unsigned char alarm_min 0; bit alarm_enable 0; bit alarm_ringing 0; unsigned int alarm_beep_cnt 0; // ??: 0-????, 1-??????, 2-?????? unsigned char mode 0; // ???? void DisplayTime() { unsigned char page 3; ShowNum(page, 75, hour / 10); ShowNum(page, 90, hour % 10); ShowColon(page, 104); ShowNum(page, 0, min / 10); ShowNum(page, 8, min % 10); ShowColon(page, 30); ShowNum(page, 43, sec / 10); ShowNum(page, 56, sec % 10); } // ?????? void DisplayAlarmSet() { unsigned char page 6; ShowNum(page, 75, alarm_hour / 10); ShowNum(page, 90, alarm_hour % 10); ShowColon(page, 104); ShowNum(page, 0, alarm_min / 10); ShowNum(page, 8, alarm_min % 10); } // ?????? void DisplayTitle() { if(mode 0) { ShowChinese(0, 48, ChineseZhu); ShowChinese(0, 64, ChineseQi); } else if(mode 1) { ShowQi(); } } // ???? - ??????? void CheckAlarm() { if(alarm_enable !alarm_ringing) { if(hour alarm_hour min alarm_min) { alarm_ringing 1; alarm_beep_cnt 0; // ?????,?????? } } } // ???? void StopAlarm() { alarm_ringing 0; BEEP 1; } // ???? unsigned char KeyScan(void) { // ????????? if(alarm_ringing) { if(KEY_SET 0 || KEY_HOUR 0 || KEY_MIN 0 || KEY_SEC 0 || KEY_OK 0) { delay(20); if(KEY_SET 0 || KEY_HOUR 0 || KEY_MIN 0 || KEY_SEC 0 || KEY_OK 0) { StopAlarm(); return 0; } } } // SET? - ???? if(KEY_SET 0 !alarm_ringing) { delay(20); if(KEY_SET 0) { while(KEY_SET 0); mode; if(mode 2) mode 0; ClearTitleArea(); ClearBottomArea(); if(mode 0) { DisplayTitle(); } else if(mode 1) { DisplayTitle(); } else if(mode 2) { DisplayAlarmSet(); } return 1; } } // ?????? if(mode 1) { if(KEY_HOUR 0) { delay(20); if(KEY_HOUR 0) { while(KEY_HOUR 0); hour; if(hour 24) hour 0; return 2; } } if(KEY_MIN 0) { delay(20); if(KEY_MIN 0) { while(KEY_MIN 0); min; if(min 60) min 0; return 3; } } if(KEY_SEC 0) { delay(20); if(KEY_SEC 0) { while(KEY_SEC 0); sec 0; return 4; } } } // ?????? if(mode 2) { if(KEY_HOUR 0) { delay(20); if(KEY_HOUR 0) { while(KEY_HOUR 0); alarm_hour; if(alarm_hour 24) alarm_hour 0; DisplayAlarmSet(); return 2; } } if(KEY_MIN 0) { delay(20); if(KEY_MIN 0) { while(KEY_MIN 0); alarm_min; if(alarm_min 60) alarm_min 0; DisplayAlarmSet(); return 3; } } if(KEY_OK 0) { delay(20); if(KEY_OK 0) { while(KEY_OK 0); alarm_enable 1; return 5; } } } return 0; } // ?????? void TimerInit() { TMOD | 0x01; TH0 0x4C; TL0 0x00; ET0 1; EA 1; TR0 1; } // ????? void TimerISR() interrupt 1 { TH0 0x4C; TL0 0x00; // ?????? if(alarm_ringing) { alarm_beep_cnt; if(alarm_beep_cnt 10) { BEEP ~BEEP; } else if(alarm_beep_cnt 20) { alarm_beep_cnt 0; } } // ????(?????????) if(mode 0 !alarm_ringing) { timer_cnt; if(timer_cnt 20) { timer_cnt 0; sec; if(sec 60) { sec 0; min; if(min 60) { min 0; hour; if(hour 24) hour 0; } // ????????? CheckAlarm(); } } } } void main() { unsigned char key; LCD_Init(); delay(50); LCD_Clear(); delay(50); // ???????? BeepOnce(); DisplayTitle(); TimerInit(); while(1) { key KeyScan(); DisplayTime(); if(mode 2) { DisplayAlarmSet(); } delay(100); } }博主的参考代码#include reg51.h // 12864 LCD 指令宏定义 #define LCDDisp_Off 0x3e // 液晶显示关闭指令 #define LCDDisp_On 0x3f // 液晶显示开启指令 #define Page_Add 0xb8 // 页地址基地址(12864共8页:0~7) #define LCDCol_Add 0x40 // 列地址基地址(单屏64列:0~63) #define Start_Line 0xC0 // 显示起始行地址 // 硬件端口定义 #define LCD_DATA P0 // LCD 8位数据总线接单片机P0口 sbit LCDMcs P2^4; // 左半屏片选信号低电平选中 sbit LCDScs P2^3; // 右半屏片选信号低电平选中 sbit LCDDi P2^2; // 寄存器选择位0指令1数据 sbit LCDRW P2^1; // 读写选择位0写操作1读操作 sbit LCDEnable P2^0; // 使能信号上升/下降沿触发读写 // 16*16 汉字点阵字模数据 // 汉字灯 纵向取模共32字节(16*16点阵占用2页) char code Hz_Deng[] { 0xE0,0xF0,0xDF,0x7E,0x88,0x08,0x78,0xD8, 0xFE,0xFF,0xE0,0x00,0x00,0x00,0x40,0x80, 0x03,0x04,0xC8,0x39,0x09,0x09,0x08,0x08, 0xF8,0xF5,0xF3,0xF0,0xE0,0xE0,0xF0,0xCF }; // 汉字萍 char code Bmp_Miao[] { 0x00,0x00,0x88,0x10,0x00,0xF0,0x90,0x90, 0x90,0xFC,0x90,0x90,0x30,0x00,0x00,0x00, 0x00,0x00,0x10,0x09,0x20,0x1F,0x20,0x23, 0x14,0x08,0x14,0x23,0x20,0x00,0x00,0x00 }; // 汉字波 char code Bmp_bo[] { 0x00,0x80,0x00,0x20,0xE0,0x00,0x08,0x30, 0xC0,0x00,0x02,0x0C,0x70,0x80,0x00,0x00, 0x00,0x00,0x00,0x02,0x03,0x00,0x10,0x0C, 0x03,0x00,0x40,0x30,0x0E,0x01,0x00,0x00 }; // 简易延时函数 // t: 延时参数用于液晶时序配合 void LCDdelay(unsigned int t) { unsigned int i, j; for(i 0; i t; i) for(j 0; j 10; j); } // 向LCD写入命令 // cmdcode: 待写入的指令码 void write_com(unsigned char cmdcode) { LCDDi 0; // 选择指令寄存器 LCDRW 0; // 设置为写模式 LCD_DATA cmdcode; // 指令送到数据口P0 LCDEnable 1; // 拉高使能 LCDdelay(1); // 时序延时 LCDEnable 0; // 拉低使能完成指令写入 LCDdelay(2); // 等待指令执行 } // 向LCD写入显示数据 // LCDDispdata: 待写入的点阵数据 void write_data(unsigned char LCDDispdata) { LCDDi 1; // 选择数据寄存器 LCDRW 0; // 设置为写模式 LCD_DATA LCDDispdata; // 数据送到数据口P0 LCDEnable 1; // 拉高使能 LCDdelay(1); // 时序延时 LCDEnable 0; // 拉低使能完成数据写入 LCDdelay(2); // 等待数据刷新 } // LCD 初始化函数 void init_lcd() { LCDdelay(100); // 上电稳定延时 LCDMcs 1; // 取消左屏片选 LCDScs 1; // 取消右屏片选 LCDdelay(100); // 等待硬件稳定 write_com(LCDDisp_Off); // 先关闭显示 write_com(Page_Add 0); // 设置初始页地址为第0页 write_com(Start_Line 0);// 设置显示起始行为第0行 write_com(LCDCol_Add 0);// 设置初始列地址为第0列 write_com(LCDDisp_On); // 开启液晶显示 } // 全屏清屏函数 void Clr_Scr() { unsigned char j, k; // 清空左半屏 LCDMcs 0; // 选中左屏 LCDScs 1; // 关闭右屏 for(k 0; k 8; k) // 遍历全部8页 { write_com(Page_Add k); // 设置当前页 write_com(LCDCol_Add 0); // 列地址归零 for(j 0; j 64; j) // 遍历当前页64列 { write_data(0x00); // 写入0清亮点阵 } } // 清空右半屏 LCDMcs 1; // 关闭左屏 LCDScs 0; // 选中右屏 for(k 0; k 8; k) // 遍历全部8页 { write_com(Page_Add k); // 设置当前页 write_com(LCDCol_Add 0); // 列地址归零 for(j 0; j 64; j) // 遍历当前页64列 { write_data(0x00); // 写入0清亮点阵 } } LCDMcs 1; // 同时关闭左右屏片选 LCDScs 1; } // 16*16 汉字显示函数 // page: 起始页(范围0~7) // column: 起始列(范围0~63) // hzk: 汉字点阵数组首地址 void hz_LCDDisp16(unsigned char page, unsigned char column, unsigned char code *hzk) { unsigned char j; // 写入汉字上半部分(当前页) write_com(Page_Add page); // 设置页地址 write_com(LCDCol_Add column); // 设置起始列 for(j 0; j 16; j) // 连续写入16列数据 { write_data(hzk[j]); } // 写入汉字下半部分(下一页16*16汉字占连续2页) write_com(Page_Add page 1); // 切换到下一页 write_com(LCDCol_Add column); // 列地址保持不变 for(j 16; j 32; j) // 写入后16字节点阵 { write_data(hzk[j]); } } // 主函数 void main() { init_lcd(); // 初始化12864液晶 Clr_Scr(); // 全屏清屏 // 左半屏在第0页、第48列显示汉字【灯】 LCDMcs 0; // 选中左屏 LCDScs 1; // 关闭右屏 hz_LCDDisp16(0, 48, Hz_Deng); // 右半屏依次显示【萍】、【波】 LCDMcs 1; // 关闭左屏 LCDScs 0; // 选中右屏 hz_LCDDisp16(0, 0, Bmp_Miao); // 第0页第0列 显示 萍 hz_LCDDisp16(0, 16, Bmp_bo); // 第0页第16列 显示 波 LCDMcs 1; // 释放所有片选 LCDScs 1; while(1); // 程序循环停留 }取字模修改代码PCtoLCD2002显示屏专用取模工具下载链接https://pan.baidu.com/s/1Q6VF5K6OlvfoiWcntIZw3w?pwdtfgx提取码: tfgxgithub地址lcd12864_catpoo/bb.LST at master · BtonGu/lcd12864_catpoo · GitHub#include reg51.h // 12864 LCD 驱动 #define LCDDisp_Off 0x3e #define LCDDisp_On 0x3f #define Page_Add 0xb8 #define LCDCol_Add 0x40 #define Start_Line 0xC0 #define LCD_DATA P0 sbit LCDMcs P2^4; sbit LCDScs P2^3; sbit LCDDi P2^2; sbit LCDRW P2^1; sbit LCDEnable P2^0; // 8x16 数字字模 char code Num0[] { 0x00,0xE0,0x10,0x08, 0x08,0x10,0xE0,0x00, 0x00,0x0F,0x10,0x20, 0x20,0x10,0x0F,0x00 }; char code Num1[] { 0x00,0x00,0x10,0x10, 0xF8,0x00,0x00,0x00, 0x00,0x00,0x20,0x20, 0x3F,0x20,0x20,0x00 }; char code Num2[] { 0x00,0x70,0x08,0x08, 0x08,0x08,0xF0,0x00, 0x00,0x30,0x28,0x24, 0x22,0x21,0x30,0x00 }; char code Num3[] { 0x00,0x30,0x08,0x08, 0x08,0x88,0x70,0x00, 0x00,0x18,0x20,0x21, 0x21,0x22,0x1C,0x00 }; char code Num4[] { 0x00,0x00,0x80,0x40, 0x30,0xF8,0x00,0x00, 0x00,0x06,0x05,0x24, 0x24,0x3F,0x24,0x24 }; char code Num5[] { 0x00,0xF8,0x88,0x88, 0x88,0x08,0x08,0x00, 0x00,0x19,0x20,0x20, 0x20,0x11,0x0E,0x00 }; char code Num6[] { 0x00,0xE0,0x10,0x88, 0x88,0x90,0x00,0x00, 0x00,0x0F,0x11,0x20, 0x20,0x20,0x1F,0x00 }; char code Num7[] { 0x00,0x18,0x08,0x08, 0x88,0x68,0x18,0x00, 0x00,0x00,0x00,0x3E, 0x01,0x00,0x00,0x00 }; char code Num8[] { 0x00,0x70,0x88,0x08, 0x08,0x88,0x70,0x00, 0x00,0x1C,0x22,0x21, 0x21,0x22,0x1C,0x00 }; char code Num9[] { 0x00,0xF0,0x08,0x08, 0x08,0x10,0xE0,0x00, 0x00,0x01,0x12,0x22, 0x22,0x11,0x0F,0x00 }; char code Colon[] { 0x00,0x00,0x00,0xC0, 0xC0,0x00,0x00,0x00, 0x00,0x00,0x00,0x30, 0x30,0x00,0x00,0x00 }; // 8x16 字母字模 char code Letter_A[] { 0x00,0x00,0xC0,0x38, 0xE0,0x00,0x00,0x00, 0x20,0x3C,0x23,0x02, 0x02,0x27,0x38,0x20 }; char code Letter_B[] { 0x08,0xF8,0x88,0x88, 0x88,0x70,0x00,0x00, 0x20,0x3F,0x20,0x20, 0x20,0x11,0x0E,0x00 }; char code Letter_C[] { 0xC0,0x30,0x08,0x08, 0x08,0x08,0x38,0x00, 0x07,0x18,0x20,0x20, 0x20,0x10,0x08,0x00 }; char code Letter_D[] { 0x08,0xF8,0x08,0x08, 0x08,0x10,0xE0,0x00, 0x20,0x3F,0x20,0x20, 0x20,0x10,0x0F,0x00 }; char code Letter_E[] { 0x08,0xF8,0x88,0x88, 0xE8,0x08,0x10,0x00, 0x20,0x3F,0x20,0x20, 0x23,0x20,0x18,0x00 }; char code Letter_F[] { 0x08,0xF8,0x88,0x88, 0xE8,0x08,0x10,0x00, 0x20,0x3F,0x20,0x00, 0x03,0x00,0x00,0x00 }; char code Letter_G[] { 0xC0,0x30,0x08,0x08, 0x08,0x38,0x00,0x00, 0x07,0x18,0x20,0x20, 0x22,0x1E,0x02,0x00 }; char code Letter_H[] { 0x08,0xF8,0x08,0x00, 0x00,0x08,0xF8,0x08, 0x20,0x3F,0x21,0x01, 0x01,0x21,0x3F,0x20 }; char code Letter_I[] { 0x00,0x08,0x08,0xF8, 0x08,0x08,0x00,0x00, 0x00,0x20,0x20,0x3F, 0x20,0x20,0x00,0x00 }; char code Letter_J[] { 0x00,0x00,0x08,0x08, 0xF8,0x08,0x08,0x00, 0xC0,0x80,0x80,0x80, 0x7F,0x00,0x00,0x00 }; char code Letter_K[] { 0x08,0xF8,0x88,0xC0, 0x28,0x18,0x08,0x00, 0x20,0x3F,0x20,0x01, 0x26,0x38,0x20,0x00 }; char code Letter_L[] { 0x08,0xF8,0x08,0x00, 0x00,0x00,0x00,0x00, 0x20,0x3F,0x20,0x20, 0x20,0x20,0x30,0x00 }; char code Letter_M[] { 0x08,0xF8,0xF8,0x00, 0xF8,0xF8,0x08,0x00, 0x20,0x3F,0x01,0x3E, 0x01,0x3F,0x20,0x00 }; char code Letter_N[] { 0x08,0xF8,0x30,0xC0, 0x00,0x08,0xF8,0x08, 0x20,0x3F,0x20,0x00, 0x07,0x18,0x3F,0x00 }; char code Letter_O[] { 0xE0,0x10,0x08,0x08, 0x08,0x10,0xE0,0x00, 0x0F,0x10,0x20,0x20, 0x20,0x10,0x0F,0x00 }; char code Letter_P[] { 0x08,0xF8,0x08,0x08, 0x08,0x08,0xF0,0x00, 0x20,0x3F,0x21,0x01, 0x01,0x01,0x00,0x00 }; char code Letter_Q[] { 0xE0,0x10,0x08,0x08, 0x08,0x10,0xE0,0x00, 0x0F,0x10,0x28,0x28, 0x30,0x50,0x4F,0x00 }; char code Letter_R[] { 0x08,0xF8,0x88,0x88, 0x88,0x88,0x70,0x00, 0x20,0x3F,0x20,0x00, 0x03,0x0C,0x30,0x20 }; char code Letter_S[] { 0x00,0x70,0x88,0x08, 0x08,0x08,0x38,0x00, 0x00,0x38,0x20,0x21, 0x21,0x22,0x1C,0x00 }; char code Letter_T[] { 0x18,0x08,0x08,0xF8, 0x08,0x08,0x18,0x00, 0x00,0x00,0x20,0x3F, 0x20,0x00,0x00,0x00 }; char code Letter_U[] { 0x08,0xF8,0x08,0x00, 0x00,0x08,0xF8,0x08, 0x00,0x1F,0x20,0x20, 0x20,0x20,0x1F,0x00 }; char code Letter_V[] { 0x08,0x78,0x88,0x00, 0x00,0xC8,0x38,0x08, 0x00,0x00,0x07,0x38, 0x0E,0x01,0x00,0x00 }; char code Letter_W[] { 0x08,0xF8,0x00,0xF8, 0x00,0xF8,0x08,0x00, 0x00,0x03,0x3E,0x01, 0x3E,0x03,0x00,0x00 }; char code Letter_X[] { 0x08,0x18,0x68,0x80, 0x80,0x68,0x18,0x08, 0x20,0x30,0x2C,0x03, 0x03,0x2C,0x30,0x20 }; char code Letter_Y[] { 0x08,0x38,0xC8,0x00, 0xC8,0x38,0x08,0x00, 0x00,0x00,0x20,0x3F, 0x20,0x00,0x00,0x00 }; char code Letter_Z[] { 0x10,0x08,0x08,0x08, 0xC8,0x38,0x08,0x00, 0x20,0x38,0x26,0x21, 0x20,0x20,0x18,0x00 };显示时间正常代码#include reg51.h // LCD???? sbit RS P2^2; sbit RW P2^1; sbit EN P2^0; sbit CS1 P2^4; sbit CS2 P2^3; // ?? void delay(unsigned int ms) { unsigned int i, j; for(i 0; i ms; i) for(j 0; j 123; j); } // ??? void WriteCmd(unsigned char cmd) { RS 0; RW 0; P0 cmd; EN 1; delay(1); EN 0; } // ??? void WriteData(unsigned char dat) { RS 1; RW 0; P0 dat; EN 1; delay(1); EN 0; } // LCD??? void LCD_Init() { delay(50); CS1 1; CS2 1; WriteCmd(0x3F); delay(5); WriteCmd(0xC0); delay(5); } // ?? void LCD_Clear() { unsigned char page, col; CS1 1; CS2 0; for(page 0; page 8; page) { WriteCmd(0xB8 | page); WriteCmd(0x40); for(col 0; col 64; col) WriteData(0x00); } CS1 0; CS2 1; for(page 0; page 8; page) { WriteCmd(0xB8 | page); WriteCmd(0x40); for(col 0; col 64; col) WriteData(0x00); } CS1 1; CS2 1; } // ???? code unsigned char Num0[] {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00}; code unsigned char Num1[] {0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00}; code unsigned char Num2[] {0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00}; code unsigned char Num3[] {0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00}; code unsigned char Num4[] {0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24}; code unsigned char Num5[] {0x00,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x20,0x20,0x20,0x11,0x0E,0x00}; code unsigned char Num6[] {0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00}; code unsigned char Num7[] {0x00,0x18,0x08,0x08,0x88,0x68,0x18,0x00,0x00,0x00,0x00,0x3E,0x01,0x00,0x00,0x00}; code unsigned char Num8[] {0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00}; code unsigned char Num9[] {0x00,0xF0,0x08,0x08,0x08,0x10,0xE0,0x00,0x00,0x01,0x12,0x22,0x22,0x11,0x0F,0x00}; code unsigned char Colon[] {0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00}; code unsigned char *NumTable[10] {Num0, Num1, Num2, Num3, Num4, Num5, Num6, Num7, Num8, Num9}; // ?????? void ShowNum(unsigned char page, unsigned char col, unsigned char num) { unsigned char i; unsigned char *p; if(num 9) return; p NumTable[num]; if(col 64) { CS1 1; CS2 0; WriteCmd(0xB8 | page); WriteCmd(0x40 | col); for(i 0; i 8; i) WriteData(p[i]); WriteCmd(0xB8 | (page 1)); WriteCmd(0x40 | col); for(i 8; i 16; i) WriteData(p[i]); } else { CS1 0; CS2 1; WriteCmd(0xB8 | page); WriteCmd(0x40 | (col - 64)); for(i 0; i 8; i) WriteData(p[i]); WriteCmd(0xB8 | (page 1)); WriteCmd(0x40 | (col - 64)); for(i 8; i 16; i) WriteData(p[i]); } } // ???? void ShowColon(unsigned char page, unsigned char col) { unsigned char i; if(col 64) { CS1 1; CS2 0; WriteCmd(0xB8 | page); WriteCmd(0x40 | col); for(i 0; i 8; i) WriteData(Colon[i]); WriteCmd(0xB8 | (page 1)); WriteCmd(0x40 | col); for(i 8; i 16; i) WriteData(Colon[i]); } else { CS1 0; CS2 1; WriteCmd(0xB8 | page); WriteCmd(0x40 | (col - 64)); for(i 0; i 8; i) WriteData(Colon[i]); WriteCmd(0xB8 | (page 1)); WriteCmd(0x40 | (col - 64)); for(i 8; i 16; i) WriteData(Colon[i]); } } // ???? unsigned char hour 10; unsigned char min 30; unsigned char sec 45; unsigned int timer_cnt 0; // ???? // ????:? :SS ? HH:MM void DisplayTime() { unsigned char page 3; // ??:MM ?? ShowNum(page, 0, min / 10); ShowNum(page, 8, min % 10); // ??::SS ? ShowColon(page, 30); ShowNum(page, 43, sec / 10); ShowNum(page, 56, sec % 10); // ??:HH: ?? ShowNum(page, 75, hour / 10); ShowNum(page, 90, hour % 10); ShowColon(page, 104); } // ?????? void TimerInit() { TMOD | 0x01; TH0 0x4C; TL0 0x00; ET0 1; EA 1; TR0 1; } // ????? void TimerISR() interrupt 1 { TH0 0x4C; TL0 0x00; timer_cnt; if(timer_cnt 20) { timer_cnt 0; sec; if(sec 60) { sec 0; min; if(min 60) { min 0; hour; if(hour 24) hour 0; } } } } void main() { LCD_Init(); delay(50); LCD_Clear(); delay(50); TimerInit(); while(1) { DisplayTime(); delay(50); } }proteus仿真1.要求用12864显示 能够显示汉字2、能够设置两个闹钟使用单片机定时器计时能够设置单次循环日循环和周循环