也不知发成功没有 测试一下
单片机源程序如下:
- //SMG12864C标准图形点阵型液晶显示模块的演示程序[C51编程语言][MCS51模拟口线接口方式]
- //应用产品: SMG12864C SMG12864BV SMG12864A SMG12864D3 标准图形点阵型液晶显示模块
- // 本演示程序适用于SMG12864C液晶显示模块与MCS51系列单片机采用MCS51模拟口线的
- //硬件连线方式。
- // 本演示程序包括KS0108B兼容芯片的MCS51模拟口线接口子程序集,KS0108B兼容芯片的12864
- //液晶显示模块的基本子程序,12864系列绘图子程序集,12864系列图形子程序集,12864系列
- //精简中英文字库子程序集,以及SMG12864C系列标准图形点阵型液晶显示的演示子程序.
- // 本演示的内容为,在128列X64行的点阵液晶显示屏上清屏,图片演示,英文字符串演示,
- //中文字符串演示,反白显示字符串,绘制矩形,写点,绘制直线,全屏显示.
- //-------------------------------------------------------------------------------
- //创建日期: 2020.5.18
- //软件环境: VW For Windows
- //硬件环境: STC MCU,MCS-51系列 MCU,etc.
- //工程师 :YF
- //-------------------------------------------------------------------------------
- //#include <stc15.h>
- #include <reg51.h>
- #include <intrins.h>
- signed char second=0,minute=0,hour=12,count=0; //从中午开始计时就改hour
- unsigned int day=53;
- void num2str(unsigned int dd);
- void time0_init();
- //以下为演示程序的函数定义
- void exsample(void); //演示程序
- void exdelay(void); //演示延时子程序
- void putchar(unsigned int c); //定位写字符子程序
- void putcharD(unsigned int d); //定位写大字符子程序
- void putstr(unsigned char code *s); //显示字符串子程序,字符码为0时退出
- void putstrD(unsigned char code *t); //显示大字符串子程序,字符码为0时退出
- unsigned char code *getchinesecodepos(unsigned int ac);
- unsigned char code *getChn_Codepos(unsigned int ad); //中文大字符
- unsigned char code *getenglishcodepos(unsigned char ac);
- unsigned char code *getEng_Codepos(unsigned char ad); //英文大字符
- void putimage(unsigned char code *s); //显示图形子程序
- void putsizeimage(unsigned char XSIZE,unsigned char YSIZE,unsigned char code *s);
- //显示指定大小的图形子程序
- // void point(bit b);
- // void line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b);
- // void lineto(unsigned char x1,unsigned char y1,bit b);//绘制(XPOS,YPOS)-(X1,Y1)的直线
- // void rect(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b);
- void lcdfill(unsigned char d); //整屏显示d代表的字节数据子程序
- void lcdpos(void); //设置坐标点(XPOS,YPOS)内部RAM地址的子程序
- void lcdreset(void); //液晶显示控制器初始化子程序
- void setlcdvoltage(unsigned char vol); //LCD电压设置
- void lcdwd(unsigned char d); //送图形数据子程序
-
- void lcdwc(unsigned char c); //送指令子程序
- void lcdwaitidle(void); //忙检测子程序
- void lcdwd1(unsigned char d); //送图形数据子程序
-
- void lcdwc1(unsigned char c); //送指令子程序
- void lcdwaitidle1(void); //忙检测子程序
- void lcdwd2(unsigned char d); //送图形数据子程序
-
- void lcdwc2(unsigned char c); //送指令子程序
- void lcdwaitidle2(void); //忙检测子程序
- //-------------------------------------------------------------------------------
- //SMG12864C产品引脚说明及演示连线
- //PIN1: VSS [电源地]
- //PIN2: VDD [电源正极]
- //PIN3: Vo [LCD偏压输入]
- //PIN4: RS [数据/命令选择端 1:数据 0:命令]
- //PIN5: RW [读写信号选择端 1:读操作 0:写操作]
- //PIN6: E [使能信号输入 高有效]
- //PIN7: DB0 [Data I/O]
- //PIN8: DB1 [Data I/O]
- //PIN9: DB2 [Data I/O]
- //PIN10:DB3 [Data I/O]
- //PIN11:DB4 [Data I/O]
- //PIN12:DB5 [Data I/O]
- //PIN13:DB6 [Data I/O]
- //PIN14:DB7 [Data I/O]
- //PIN15:CS1 [片选1信号输入 高有效]
- //PIN16:CS2 [片选2信号输入 高有效]
- //PIN17:RST [复位信号输入(H:正常工作,L:复位)]
- //PIN18:VEE [LCD驱动负压输出(-10V)]
- //PIN19:EL-E [EL 使能端(低电平有效)]
- //PIN20:NC [空脚]
- //注:8031的晶振频率为12MHz.
- //请参见http://download.sunman.cn/lcm/product/1/SMG12864C.pdf
- /************* 本地变量声明 **************/
- void Send_595(unsigned char dat);
- void Send_byte_over(unsigned char sda);
- sfr AUXR = 0x8E; //0000,0000 辅助寄存器
- sfr P4 = 0xe8;
- sbit P46 = P4^6;
- sbit P45 = P4^5; //ISP下载需勾选"ALE脚用作P4.5口"
- sbit P44 = P4^4;
- sbit P43 = P4^3;
- sbit P42 = P4^2;
- sbit P41 = P4^1;
- sbit P40 = P4^0;
- sfr P5 = 0xC8;
- //-------------------------------------------------------------------------------
- //以下为产品接口引脚在演示程序中的预定义
- //用户在编写应用程序时,需按自己的实际硬件连线来重新定义
- sbit RS = P3^5; // RS对应单片机引脚
- sbit RW = P3^4; // RW对应单片机引脚
- sbit EN = P3^3; // E对应单片机引脚
- sbit CS1 = P3^2; // CS1对应单片机引脚
- sbit CS2 = P3^1; // CS2对应单片机引脚
- sbit RST = P5^5;
- sbit P_HC595_SRCLK = P1^0; //pin 11 SRCLK Shift data clock
- sbit P_HC595_RCLK = P3^7; //pin 12 RCLk store (latch) clock
- sbit P_HC595_SER = P3^6; //pin 14 SER data input
- //-------------------------------------------------------------------------------
- //以下XPOS,YPOS变量用于指示当前操作点的位置的预定义
- //用户在编写应用程序时,需按自己的实际软件程序需要来重新定义
- unsigned char XPOS; //列方向LCD点阵位置指针
- unsigned char YPOS; //行方向LCD点阵位置指针
- bit CharImageReverse; //字符及图形的反显控制,0(正常显示),1(反显)
- #define XDOTS 128 //图形空间X方向大小
- #define YDOTS 64 //图形空间X方向大小
- //-------------------------------------------------------------------------------
- //以下为精简版中英文字库
- //实际使用时请包含由Sunman精简版中英文字符库代码生成器.exe自动生成的charlib.c文
- //文件来替换该部分
- #define ENGLISHCHARNUMBER 1 //精简版英文字符库中的英文字符的个数
- #define CHINESECHARNUMBER 5 //精简版中文字符库中的中文字符的个数
- #define ENGLISHCHARSIZE 8 //英文字符X方向显示点的个数
- #define CHINESECHARSIZE 16 //中文字符X方向及中英文字符Y方向显示点的个数
- #define ENGLISHCHARDOTSIZE 16 //单个英文字符点阵的字节数
- #define CHINESECHARDOTSIZE 32 //单个中文字符点阵的字节数
- unsigned int code EnglishCode[]={
- 0x20 //字符001:[ ]
- };
- unsigned int code ChineseCode[]={
- 0xbbb9, //字符001:[还]
- 0xbee0, //字符002:[距]
- 0xbfbc, //字符003:[考]
- 0xd3d0, //字符004:[有]
- 0xd6d0 //字符005:[中]
- };
- unsigned char code EnglishCharDot[]={
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符001:[ ]
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- };
- unsigned char code ChineseCharDot[]={
- 0x40,0x00,0x40,0x40,0x42,0x20,0xcc,0x1f, //字符001:[还]
- 0x00,0x20,0x00,0x42,0x02,0x41,0x82,0x40,
- 0x42,0x40,0xf2,0x5f,0x0e,0x40,0x42,0x40,
- 0x82,0x40,0x02,0x43,0x00,0x40,0x00,0x00,
- 0x00,0x20,0x3e,0x3f,0x22,0x20,0xe2,0x1f, //字符002:[距]
- 0x22,0x11,0x3e,0x11,0x00,0x00,0xfe,0x7f,
- 0x22,0x44,0x22,0x44,0x22,0x44,0x22,0x44,
- 0x22,0x44,0xe2,0x47,0x02,0x40,0x00,0x00,
- 0x20,0x10,0x20,0x08,0x24,0x04,0x24,0x02, //字符003:[考]
- 0x24,0x01,0x24,0x0d,0xbf,0x0b,0x64,0x09,
- 0x24,0x49,0x34,0x89,0x28,0x49,0x24,0x39,
- 0x22,0x01,0x20,0x00,0x20,0x00,0x00,0x00,
- 0x04,0x04,0x04,0x02,0x04,0x01,0x84,0x00, //字符004:[有]
- 0xe4,0xff,0x3c,0x09,0x27,0x09,0x24,0x09,
- 0x24,0x09,0x24,0x49,0x24,0x89,0xe4,0x7f,
- 0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0xf0,0x0f,0x10,0x04, //字符005:[中]
- 0x10,0x04,0x10,0x04,0x10,0x04,0xff,0xff,
- 0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x04,
- 0xf0,0x0f,0x00,0x00,0x00,0x00,0x00,0x00
- };
- //本文件由Sunman精简版中英文字符库代码生成器.exe自动生成
- //字节方向:[垂直] 字位顺序:[从低到高]
- //中文字体:[华文新魏] 英文字体:[华文新魏] 字体大小:[32]
- //下面是大字体的数字和汉字天;楷体不完整;
- #define ENG_NUMBER 10 //精简版英文字符库中的英文字符的个数
- #define CHN_NUMBER 1 //精简版中文字符库中的中文字符的个数
- #define ENG_SIZE 16 //英文字符X方向显示点的个数
- #define CHN_SIZE 32 //中文字符X方向及中英文字符Y方向显示点的个数
- #define ENG_DOTSIZE 64 //单个英文字符点阵的字节数
- #define CHN_DOTSIZE 128 //单个中文字符点阵的字节数
- unsigned int code Eng_Code[]={
- 0x30, //字符001:[0]
- 0x31, //字符002:[1]
- 0x32, //字符003:[2]
- 0x33, //字符004:[3]
- 0x34, //字符005:[4]
- 0x35, //字符006:[5]
- 0x36, //字符007:[6]
- 0x37, //字符008:[7]
- 0x38, //字符009:[8]
- 0x39 //字符010:[9]
- };
- unsigned int code Chn_Code[]={
- 0xccec //字符001:[天]
- };
- unsigned char code Eng_Dot[]={
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符001:[0]
- 0x00,0xfe,0x07,0x00,0x80,0x03,0x1c,0x00,
- 0x40,0x00,0x60,0x00,0x20,0x00,0xc0,0x00,
- 0x10,0x00,0x80,0x00,0x18,0x00,0x80,0x01,
- 0x18,0x00,0x80,0x01,0x18,0x00,0x80,0x01,
- 0x18,0x00,0x80,0x01,0x18,0x00,0x80,0x00,
- 0x30,0x00,0x40,0x00,0x60,0x00,0x20,0x00,
- 0xc0,0x01,0x1c,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符002:[1]
- 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,
- 0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,
- 0xf0,0xff,0xff,0x01,0x30,0x00,0x80,0x01,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符003:[2]
- 0x00,0x00,0xc0,0x01,0x60,0x00,0xe0,0x01,
- 0x30,0x00,0xb0,0x01,0x38,0x00,0x98,0x01,
- 0x18,0x00,0x98,0x01,0x18,0x00,0x8c,0x01,
- 0x18,0x00,0x86,0x01,0x18,0x00,0x83,0x01,
- 0x38,0x80,0x81,0x01,0x30,0xc0,0x80,0x01,
- 0x60,0x70,0x80,0x01,0xc0,0x1f,0x80,0x01,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符004:[3]
- 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,
- 0x30,0x00,0x80,0x01,0x38,0x60,0x80,0x01,
- 0x18,0x60,0x80,0x01,0x18,0x60,0x80,0x01,
- 0x18,0x70,0x80,0x01,0x18,0x50,0xc0,0x01,
- 0x38,0xd0,0xc0,0x00,0x30,0x88,0x60,0x00,
- 0xe0,0x87,0x73,0x00,0x80,0x03,0x1f,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符005:[4]
- 0x00,0x00,0x07,0x00,0x00,0xc0,0x06,0x00,
- 0x00,0x60,0x06,0x00,0x00,0x10,0x06,0x00,
- 0x00,0x08,0x06,0x00,0x00,0x06,0x06,0x00,
- 0x00,0x03,0x06,0x00,0x80,0x01,0x06,0x00,
- 0xc0,0x00,0x06,0x00,0xe0,0x00,0xc6,0x01,
- 0xf0,0xff,0xff,0x01,0x00,0x00,0x06,0x00,
- 0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符006:[5]
- 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,
- 0x00,0x10,0xc0,0x01,0x80,0x1f,0xc0,0x01,
- 0x38,0x18,0x80,0x01,0x18,0x18,0x80,0x01,
- 0x18,0x18,0xc0,0x01,0x18,0x18,0xc0,0x00,
- 0x18,0x18,0xc0,0x00,0x18,0x18,0x60,0x00,
- 0x18,0x30,0x60,0x00,0x18,0x70,0x38,0x00,
- 0x18,0xc0,0x0f,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符007:[6]
- 0x00,0xc0,0x0f,0x00,0x00,0xf8,0x3f,0x00,
- 0x00,0x46,0x40,0x00,0x80,0x41,0xc0,0x00,
- 0xc0,0x20,0x80,0x01,0x60,0x20,0x80,0x01,
- 0x20,0x30,0x80,0x01,0x30,0x30,0x80,0x01,
- 0x10,0x30,0x80,0x01,0x18,0x30,0x80,0x00,
- 0x10,0x60,0xc0,0x00,0x00,0xe0,0x60,0x00,
- 0x00,0x80,0x3f,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符008:[7]
- 0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,
- 0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,
- 0x30,0x00,0xf0,0x01,0x30,0x00,0x7c,0x00,
- 0x30,0x00,0x0f,0x00,0x30,0xc0,0x01,0x00,
- 0x30,0x60,0x00,0x00,0x30,0x18,0x00,0x00,
- 0x30,0x06,0x00,0x00,0xb0,0x03,0x00,0x00,
- 0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符009:[8]
- 0x00,0x00,0x00,0x00,0xc0,0x07,0x3f,0x00,
- 0x60,0x8c,0xe1,0x00,0x30,0x90,0xc0,0x00,
- 0x10,0x70,0x80,0x01,0x18,0x60,0x80,0x01,
- 0x18,0x60,0x80,0x01,0x18,0x60,0x80,0x01,
- 0x18,0x60,0x80,0x01,0x18,0xd0,0x80,0x00,
- 0x30,0xd8,0xc0,0x00,0x60,0x8c,0x61,0x00,
- 0xc0,0x03,0x1f,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符010:[9]
- 0x00,0x0f,0x00,0x00,0xc0,0x39,0x00,0x00,
- 0x20,0x60,0x00,0x00,0x30,0x40,0x80,0x01,
- 0x10,0xc0,0x80,0x01,0x18,0xc0,0x80,0x00,
- 0x18,0xc0,0xc0,0x00,0x18,0xc0,0x40,0x00,
- 0x18,0x40,0x20,0x00,0x10,0x40,0x38,0x00,
- 0x30,0x20,0x0c,0x00,0x60,0xb0,0x07,0x00,
- 0x80,0xff,0x01,0x00,0x00,0x00,0x00,0x00
- };
- unsigned char code Chn_Dot[]={
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符001:[天]
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,
- 0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x01,
- 0x00,0x00,0xc0,0x00,0x00,0xc0,0x40,0x00,
- 0x00,0x40,0x20,0x00,0x80,0x61,0x10,0x00,
- 0x80,0x63,0x08,0x00,0x80,0x63,0x03,0x00,
- 0x80,0xfb,0x03,0x00,0xc0,0x33,0x03,0x00,
- 0xc0,0x31,0x02,0x00,0xc0,0x10,0x04,0x00,
- 0xe0,0x10,0x00,0x00,0x40,0x18,0x00,0x00,
- 0x00,0x18,0x30,0x00,0x00,0x10,0xe0,0x00,
- 0x00,0x00,0xe0,0x01,0x00,0x00,0xc0,0x01,
- 0x00,0x00,0xc0,0x01,0x00,0x00,0xc0,0x01,
- 0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,
- 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- };
- /*------------------------------------------------
- uS延时函数,含有输入参数 unsigned char t,无返回值
- unsigned char 是定义无符号字符变量,其值的范围是
- 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
- 长度如下 T=tx2+5 uS
- ------------------------------------------------*/
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- /*------------------------------------------------
- mS延时函数,含有输入参数 unsigned char t,无返回值
- unsigned char 是定义无符号字符变量,其值的范围是
- 0~255 这里使用晶振12M,精确延时请使用汇编
- ------------------------------------------------*/
- void DelayMs(unsigned char t)
- {
-
- while(t--)
- {
- //大致延时100uS
- DelayUs2x(50);
- DelayUs2x(50);
- }
- }
- ////-------------------------------------------------------------------------------
- ////以下为图片库点阵代码
- ////实际使用时请包含由SUNMAN图形点阵代码生成器.EXE自动生成的imagelib.c文件来替换
- void TM0_Isr() interrupt 1 using 1
- {
- count++;
- if(count==100)
- {
- count=0;
- second--;
- if(second<0)
- {
- second=59;
- minute--;
- if(minute<0)
- {
- minute=59;
- hour--;
- if(hour<0)
- {
- hour=24;
- day--;
- }
- if(day==0)
- {
- day=99;
- }
- }
-
- }
-
- }
-
- }
- void time0_init()
- {
- //AUXR |= 0x80; //定时器0为1T模式
- AUXR &= 0x7f; //定时器0为12T模式
- TMOD = 0x00;
- TL0 = (65536-9217)%256; //10ms
- TH0 = (65536-9217)/256;
- TR0 = 1; //启动定时器
- ET0 = 1; //使能定时器中断
- EA = 1;
- }
- void num2str(unsigned int dd) //将两位数字拆分为10位和个位的数字,放入字符函数的数组地址中,分别用字符输出函数显示输出
- { unsigned int a,b;
- a=dd/10%10; //两位整数的10位
- b=dd%10; //两位整数的个位
- //Eng_Code[]是英文大字符的名称数组16进制编号,Eng_Dot[]是英文大字符的图形点阵地址数组
- putcharD(a+0X30);
- //exdelay();
- putcharD(b+0X30);
- exdelay();
- }
- //-------------------------------------------------------------------------------
- void main(void)
- {
- P42 = 0;
- RST = 0;
- exdelay();
- RST = 1;
- time0_init();
- while(1)
- {
- lcdreset(); //初始化液晶显示控制器
- exsample(); //演示程序
- }
- }
- void exsample(void) //演示程序
- {
- //0.演示前的准备,将LCD液晶显示全部清空
- CharImageReverse=0; //反显关闭
- lcdfill(0); //清屏
- //1.图片测试: 在(8,16)位置显示32点阵SUNMAN图标
- // XPOS=8;
- // YPOS=8;
- // putimage(Img_sunman_32); //写数据到当前LCDRAM地址中
- // exdelay(); //延时约600mS
- //3.字符串测试: 在(40,32)位置显示"太阳人电子"字符串.
- XPOS=10;
- YPOS=0;
- putstr("距中考还有");
- // exdelay(); //延时约600mS
-
- //2.字符串测试: 在(26,32)位置显示变化的数字day,在(58,32)位置显示"天"字符串.
- XPOS=26;
- YPOS=32;
- num2str(day); //字符串变量一般都是数组,如何用指针变量定位码表中的字符?
- XPOS=58;
- YPOS=32;
- putstrD("天");
- exdelay(); //延时约600mS
- exdelay();exdelay();
- //4.反显测试: 在(40,32)位置反显"太阳人电子"字符串.
- XPOS=26;
- YPOS=32;
- CharImageReverse=1;
- num2str(day);
- XPOS=58;
- YPOS=32;
- putstrD("天");
- CharImageReverse=0;
- exdelay(); //延时约600mS
- exdelay();
- }
- void exdelay(void) //演示延时子程序
- { unsigned char i,j,k; //延时约600mS
- for(i=0;i<60;i++)
- for(j=0;j<100;j++)
- for(k=0;k<200;k++);
- }
- //-------------------------------------------------------------------------------
- //以下putchar为字符对象的基本子程序,putstr为字符对象的扩充子程序,getchinesecodepos,
- //getenglishcodepos为字符对象的辅助子程序.
- //-------------------------------------------------------------------------------
- //子程序名称:void putchar(unsigned int c).
- //功能:在(XPOS,YPOS)位置写单个字符点阵,若c>128 表示为中文字符,否则为西文字符
- //修改日期:2009.8.18
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void putchar(unsigned int c) //定位写字符子程序
- { if(c>128)
- putsizeimage(CHINESECHARSIZE,CHINESECHARSIZE,getchinesecodepos(c));
- else
- putsizeimage(ENGLISHCHARSIZE,CHINESECHARSIZE,getenglishcodepos(c));
- }
- //-------------------------------------------------------------------------------
- void putcharD(unsigned int d) //定位写大字符子程序
- { if(d>128)
- putsizeimage(CHN_SIZE,CHN_SIZE,getChn_Codepos(d));
- else
- putsizeimage(ENG_SIZE,CHN_SIZE,getEng_Codepos(d));
- }
- //-------------------------------------------------------------------------------
- //子程序名称:void putstr(unsigned char code *s).
- //功能:写字符串点阵,若*s=0 表示字符串结束.
- //修改日期:2009.8.18
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void putstr(unsigned char code *s) //显示字符串子程序,字符码为0时退出
- { unsigned int c;
- while(1)
- { c=*s;
- s++;
- if(c==0) break;
- if(c<128)
- putchar(c);
- else
- { putchar(c*256+*s);
- s++;
- }
- }
- }
- //-------------------------------------------------------------------------------
- void putstrD(unsigned char code *t) //显示大字符串子程序,字符码为0时退出
- { unsigned int c;
- while(1)
- { c=*t;
- t++;
- if(c==0) break;
- if(c<128)
- putcharD(c);
- else
- { putcharD(c*256+*t);
- t++;
- }
- }
- }
- //-------------------------------------------------------------------------------
- //子程序名称:unsigned char code *getchinesecodepos(unsigned char ac).
- //功能:根据当前中文字符码查表后计算得到当前中文字符码的字库点阵位置.
- //修改日期:2009.8.18
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- unsigned char code *getchinesecodepos(unsigned int ac)
- { unsigned int min,max,mid,midc;
- min=0;
- max=CHINESECHARNUMBER-1;
- while(1)
- { if(max-min<2)
- { if(ChineseCode[min]==ac)
- mid=min;
- else if(ChineseCode[max]==ac)
- mid=max;
- else
- mid=0;
- break;
- }
- mid=(max+min)/2;
- midc=ChineseCode[mid];
- if(midc==ac)
- break;
- else if(midc>ac)
- max=mid-1;
- else
- min=mid+1;
- }
- return ChineseCharDot+mid*CHINESECHARDOTSIZE;
- }
- //-------------------------------------------------------------------------------
- //-------------------------------------------------------------------------------
- unsigned char code *getChn_Codepos(unsigned int ad) //中文大字符
- { unsigned int min,max,mid,midc;
- min=0;
- max=CHN_NUMBER-1;
- while(1)
- { if(max-min<2)
- { if(Chn_Code[min]==ad)
- mid=min;
- else if(Chn_Code[max]==ad)
- mid=max;
- else
- mid=0;
- break;
- }
- mid=(max+min)/2;
- midc=Chn_Code[mid];
- if(midc==ad)
- break;
- else if(midc>ad)
- max=mid-1;
- else
- min=mid+1;
- }
- return Chn_Dot+mid*CHN_DOTSIZE;
- }
- //-------------------------------------------------------------------------------
- //子程序名称:unsigned char code *getenglishcodepos(unsigned char ac).
- //功能:根据当前ASCII字符码查表后计算得到当前ASCII字符码的字库点阵位置.
- //修改日期:2009.8.18
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- unsigned char code *getenglishcodepos(unsigned char ac)
- { unsigned char min,max,mid,midc;
- min=0;
- max=ENGLISHCHARNUMBER-1;
- while(1)
- { if(max-min<2)
- { if(EnglishCode[min]==ac)
- mid=min;
- else if(EnglishCode[max]==ac)
- mid=max;
- else
- mid=0;
- break;
- }
- mid=(max+min)/2;
- midc=EnglishCode[mid];
- if(midc==ac)
- break;
- else if(midc>ac)
- max=mid-1;
- else
- min=mid+1;
- }
- return EnglishCharDot+mid*ENGLISHCHARDOTSIZE;
- }
- //-------------------------------------------------------------------------------
- //-------------------------------------------------------------------------------
- unsigned char code *getEng_Codepos(unsigned char ad) //英文大字符
- { unsigned char min,max,mid,midc;
- min=0;
- max=ENG_NUMBER-1;
- while(1)
- { if(max-min<2)
- { if(Eng_Code[min]==ad)
- mid=min;
- else if(Eng_Code[max]==ad)
- mid=max;
- else
- mid=0;
- break;
- }
- mid=(max+min)/2;
- midc=Eng_Code[mid];
- if(midc==ad)
- break;
- else if(midc>ad)
- max=mid-1;
- else
- min=mid+1;
- }
- return Eng_Dot+mid*ENG_DOTSIZE;
- }
- //-------------------------------------------------------------------------------
- //以下putsizeimage为图形对象的基本子程序,putimage为图形对象的扩充子程序
- //-------------------------------------------------------------------------------
- //子程序名称:void putsizeimage(unsigned char XSIZE,unsigned YSIZE,
- // unsigned char code *s)
- //功能:在(XPOS,YPOS)位置绘制XSIZE列及YISZE行点阵的图形*S.
- //修改日期:2009.8.31
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void putsizeimage(unsigned char XSIZE,unsigned char YSIZE,unsigned char code *s)
- {
- unsigned char k,lx,ly,a1,a2,y,Lcd_Mask;
- k=YPOS&0x7;
- YSIZE+=k;
- y=YPOS;
- s--;
- for(lx=0;lx<XSIZE;lx++,XPOS++)
- { for(YPOS=y,ly=k;ly<YSIZE;)
- { unsigned char p;
- a1=*s;
- s++;
- a2=*s;
- if(CharImageReverse)
- { a1=~a1;
- a2=~a2;
- }
- for(p=0;p<k;p++)
- { a2>>=1;
- if((a1&0x1)==1)
- a2+=0x80;
- a1>>=1;
- }
- if((k==0) && (YSIZE<ly+8))
- { lcdpos();
- ly+=8;
- YPOS+=8;
- }
- else
- { lcdpos();
-
- lcdpos();
- ly+=8;
- YPOS+=8;
- Lcd_Mask=0xff;
- p=YSIZE&0x7;
- while(p>0)
- { Lcd_Mask>>=1;
- YPOS--;
- p--;
- }
- p=0xff;
- while(YSIZE<ly)
- { ly--;
- YPOS--;
- p<<=1;
- }
- Lcd_Mask&=p;
- a2&=Lcd_Mask;
- a2|=a1&(~Lcd_Mask);
- }
- lcdwd(a2);
- }
- if((k!=0) && (YSIZE&0x7 != 0) && (k >= YSIZE&0x7)) s--;
- }
- YPOS=y;
- }
- //-------------------------------------------------------------------------------
- //子程序名称:void putimage(unsigned char code *s).
- //功能:在(XPOS,YPOS)位置绘制XSIZE[*s]列及YISZE[*(s+1)]行点阵的图形[*(s+2)].
- //修改日期:2009.8.18
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void putimage(unsigned char code *s) //显示图形子程序
- {
- unsigned char XSIZE,YSIZE;
- XSIZE=*s;
- s++;
- YSIZE=*s;
- s++;
- putsizeimage(XSIZE,YSIZE,s);
- }
- //-------------------------------------------------------------------------------
- //-------------------------------------------------------------------------------
- //以下lcdfill,lcdpos,lcdreset为KS0108B型硬件接口的12864液晶显示模块的基本子程序
- //-------------------------------------------------------------------------------
- //子程序名称:void lcdfill(unsigned char d).
- //功能:整屏显示d表示的字节数据.
- //修改日期:2009.08.31
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void lcdfill(unsigned char d) //整屏显示d代表的字节数据子程序
- {
- unsigned char j;
- for(YPOS=0;YPOS<64;YPOS+=8) //8页
- { XPOS=0;
- lcdpos();
- for(j=0;j<64;j++) //64列
- lcdwd1(d); //送图形数据
- XPOS=64;
- lcdpos();
- for(j=0;j<64;j++) //64列
- lcdwd2(d); //送图形数据
- }
- XPOS=0;
- YPOS=0;
- }
- //-------------------------------------------------------------------------------
- //子程序名称:void lcdpos(void).
- //功能:设置坐标点(XPOS,YPOS)位置对应的内部RAM地址.
- //修改日期:2009.08.31
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void lcdpos(void) //设置坐标点(XPOS,YPOS)内部RAM地址的子程序
- { //unsigned char Column;
- if(XPOS<64)
- {
- lcdwc1(0xB8+((YPOS/8)&0x07)); //页地址设置
- lcdwc1(0x40+XPOS); //列地址设置
- }
- else
- { lcdwc2(0xB8+((YPOS/8)&0x07)); //页地址设置
- lcdwc2(0x40+(XPOS&0x3F)); //列地址设置
- }
- }
- //-------------------------------------------------------------------------------
- //子程序名称:void lcdreset(void)
- //功能:液晶显示控制器初始化
- //修改日期:2009.08.31
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void lcdreset(void) //液晶显示控制器初始化子程序
- {
- lcdwc1(0xC0); //设置显示初始行
- lcdwc2(0xC0); //设置显示初始行
- lcdwc1(0x3F); //开显示
- lcdwc2(0x3F); //开显示
- }
- //-------------------------------------------------------------------------------
- //子程序名称:void lcdwd(unsigned char d).
- //功能:向液晶显示控制器写图形数据.
- //修改日期:2009.08.31
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void lcdwd(unsigned char d)
- {
- if(XPOS<64)
- lcdwd1(d);
- else
- lcdwd2(d);
- }
- //-------------------------------------------------------------------------------
- //子程序名称:void lcdwd1(unsigned char d).
- //功能:向液晶显示控制器1写图形数据.
- //修改日期:2009.08.31
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void lcdwd1(unsigned char d)
- {
- lcdwaitidle1();
- Send_byte_over(d);//通过74HC595 串行输入数据,并行输出到LCD的8位数据口
- RS = 1;
- RW =0;
- CS1 =1;
- CS2 =0;
- EN =1;
- _nop_();
- EN =0;
- CS1 =0;
- }
- //-------------------------------------------------------------------------------
- //子程序名称:void lcdwd2(unsigned char d).
- //功能:向液晶显示控制器2写图形数据.
- //修改日期:2009.08.31
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void lcdwd2(unsigned char d)
- {
- lcdwaitidle2();
- Send_byte_over(d); //通过74HC595 串行输入数据,并行输出到LCD的8位数据口
- RS = 1;
- RW = 0;
- CS1 = 0;
- CS2 = 1;
- EN = 1;
- _nop_();
- EN = 0;
- CS2 = 0;
- }
- //-------------------------------------------------------------------------------
- //子程序名称:lcdwc1(unsigned char c).
- //功能:向液晶显示控制器1送指令.
- //修改日期:2009.10.30
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void lcdwc1(unsigned char c) //向液晶显示控制器1送指令
- {
- lcdwaitidle1();
- Send_byte_over(c);//通过74HC595 串行输入数据,并行输出到LCD的8位数据口
- RS = 0;
- RW = 0;
- CS1 = 1;
- CS2 = 0;
- EN = 1;
- _nop_();
- EN = 0;
- CS1 = 0;
- }
- //-------------------------------------------------------------------------------
- //子程序名称:lcdwc2(unsigned char c).
- //功能:向液晶显示控制器2送指令.
- //修改日期:2009.10.30
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void lcdwc2(unsigned char c) //向液晶显示控制器2送指令
- {
- lcdwaitidle2();
- Send_byte_over(c); //通过74HC595 串行输入数据,并行输出到LCD的8位数据口
- RS = 0;
- RW = 0;
- CS1 = 0;
- CS2 = 1;
- EN = 1;
- _nop_();
- EN = 0;
- CS2 = 0;
- }
- //-------------------------------------------------------------------------------
- //子程序名称:voidlcdwaitidle1(void).
- //功能:忙检测,在对液晶显示控制器操作的每一条指令之前,需检测液晶显示器是否空闲.
- //修改日期:2009.10.30
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void lcdwaitidle1(void) //控制器1忙检测子程序
- {
- RS = 0;
- RW = 1;
- CS1 = 1;
- CS2 = 0;
- EN = 1;
- DelayMs(1);
- EN = 0;
- CS1 = 0;
- }
- //-------------------------------------------------------------------------------
- //子程序名称:voidlcdwaitidle2(void).
- //功能:忙检测,在对液晶显示控制器操作的每一条指令之前,需检测液晶显示器是否空闲.
- //修改日期:2009.10.30
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void lcdwaitidle2(void) //控制器2忙检测子程序
- {
- RS = 0;
- RW = 1;
- CS1 = 0;
- CS2 = 1;
- EN = 1;
- DelayMs(1); //查忙由延时替代
- EN = 0;
- CS2 = 0;
- }
- /**********************************************/
- void Send_595(unsigned char dat) //发送一个字节
- {
- unsigned char i;
- for(i=0; i<8; i++)
- {
- if(dat & 0x80) P_HC595_SER = 1;
- else P_HC595_SER = 0;
- P_HC595_SRCLK = 1;
- P_HC595_SRCLK = 0;
- dat = dat << 1;
- }
- }
- void Send_byte_over(unsigned char sda)
- {
- Send_595(sda);
- P_HC595_RCLK = 1;
- P_HC595_RCLK = 0;
- }
复制代码
|