单片机和123 液晶显示 C语言代码示例 - reg52.h
#include "reg52.h" #include <intrins.h>
#define uchar unsigned char #define uint unsigned int #define width\t15\t\t\t\t\t\t\t/* 显示宽度 */\t #define Graphic\t1 #define TXT\t0 #define LcmLengthDots\t128 #define LcmWidthDots\t64\t
sbit REST = P2^0;\t\t\t\t\t\t\t\t//复位信号,低电平有效 sbit C_D = P2^1;\t\t\t\t\t\t\t\t//L:数据\tH:指令 sbit C_E = P2^2;\t\t\t\t\t\t\t//使能端,低电平有效 sbit R_D = P2^3;\t\t\t\t\t\t\t//读 sbit W_R = P2^4;\t\t\t\t\t\t\t//写
/**液晶字库/
uchar num[] = "0123456789"; typedef struct typFNT_GB16 { \tchar Mask[60]; };
code struct typFNT_GB16 GB_16[] = \t\t\t\t\t\t\t/* 汉字取模 / { \t{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD0,0x3F,0xF0,0x04,0xC0,0x7F,0xFC,\t\t\t/ 单,0 / \t 0x04,0xD0,0x1F,0x60,0x74,0x40,0x04,0xB0,0x4F,0x3E,0x30,0x0C,0x00,0x00,0x00,0x00,}, \t \t{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x1F,0x90,0x0C,0xB0,0x3F,0xFC,\t\t\t/ 片,1 */ \t 0x27,0xF4,0x23,0x24,0x07,0xC0,0x18,0xC0,0x63,0x3E,0x1C,0x0C,0x00,0x00,0x00,0x00,},
\t{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x80,0x39,0x80,0xF9,0xFC,0x1E,0x64,\t\t\t/* 机,2 / \t 0x19,0x74,0x19,0x78,0x1A,0x6C,0x1C,0x66,0x18,0x60,0x11,0xC0,0x00,0x00,0x00,0x00,}, \t \t{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x3F,0xFC,0x21,0x8C,\t\t\t/ 和,3 / \t 0x21,0x8C,0x3F,0xFC,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x00,0x00,0x00,0x00}, \t \t \t{0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x0C,0x00,0x08,0x00,0x08,0x00,0x08,0x00,\t / 1,4 */ \t 0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x00,0x00},
\t{0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x0C,0x00,0x08,0x00,0x08,0x00,0x08,0x00,\t /* 2,5 */ \t 0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x00,0x00},
\t{0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x0C,0x00,0x08,0x00,0x08,0x00,0x08,0x00,\t /* 3,6 */ \t 0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x00,0x00},
};
/液晶字库结束/
void delay_nms(uint i);\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/* 延时函数 / void write_commond(uchar com);\t\t\t\t\t\t\t\t\t/LCD12864写入8位命令子函数/ void write_date(uchar dat)\t\t; /LCD12864写入8位数据子函数/\t\t\t\t\t\t\t\t\t\t\t\t\t\t void F12864_init();\t\t\t\t\t\t\t\t\t\t\t\t\t\t/LCD12864 并行初始化子程序/\t\t\t void F12864_clear(void);\t\t\t\t\t\t\t\t\t\t/ LCD12864初始化函数 / void goto_xy(uchar x,uchar y,uchar mode);\t\t\t/ 设定显示地址 / void Putchar(uchar x,uchar y,uchar Charbyte);\t\t/ 显示一个字符 */ void display_string(uchar x,uchar y,uchar p);\t\t/ 显示字符串 / void display_num(uchar x,uchar y,uchar z);\t\t\t/ 显示数字 */ \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t void dprintf_hanzi_string_1(struct typFNT_GB16 code GB_16,uint X_pos,uint Y_pos,uchar j,uchar k); /\t汉字显示 更改汉字取模 可以更改显示汉字(数组),坐标,坐标,j=k+n (n,显示字的个数,k,从那个字开始) */ void main(void) { \tF12864_init(); \tF12864_clear(); \twhile(1) \t{ \t\tdprintf_hanzi_string_1(GB_16,1,16,7,0);\t\t\t\t \t} }
void delay_nms(uint i) { \twhile(i) \ti--; }
/* 并行
- 写命令 */ void write_commond(uchar com) { \tC_E = 0; \tC_D = 1; \tR_D = 1; \tP0 = com; \tW_R = 0;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// write\t\t \t_nop_();\t\t\t\t\t\t\t\t\t\t\t\t\t\t// disable write \tW_R = 1;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// disable write \tC_E = 1;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// disable write \tC_D = 0; }
/* 并行->写数据 */ void write_date(uchar dat)\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t { \tC_E = 0; \tC_D = 0; \tR_D = 1; \tP0 = dat; \tW_R = 0; \t_nop_(); \tW_R = 1; \tC_E = 1; \tC_D = 1; }
/*
- 写一个指令 一个数据 */ void write_dc(uchar com,uchar dat)\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t { \twrite_date(dat); \twrite_commond(com); }
/*
- 写一个指令两个数据 */ void write_ddc(uchar com,uchar dat1,uchar dat2) { \twrite_date(dat1); \twrite_date(dat2); \twrite_commond(com); }
/* 并行初始化 / void F12864_init(void) { \tREST = 0; \tdelay_nms(2000);\t\t\t\t\t\t\t\t\t\t\t\t\t\t// delay \tREST = 1; \twrite_ddc(0x40,0x00,0x00);\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// 设置文本显示首地址 \twrite_ddc(0x41,128/8,0x00);\t\t\t\t\t\t\t\t\t\t\t// 设置文本显示宽度 \twrite_ddc(0x42,0x00,0x08);\t\t\t\t\t\t\t\t\t\t\t\t\t// 设置文本显示首地址0x0800 \twrite_ddc(0x43,128/8,0x00);\t\t\t\t\t\t\t\t\t\t\t// 设置图形显示宽度 \twrite_commond(0xA0);\t\t\t\t\t\t\t\t\t\t\t\t\t// 设置光标形状88 \twrite_commond(0x80);\t\t\t\t\t\t\t\t\t\t\t\t\t// 显示方式设置 文本and图形(异或) \twrite_commond(0x92);\t\t\t\t\t\t\t\t\t\t\t\t// 设置光标 \twrite_commond(0x9F);\t\t\t\t\t\t\t\t\t\t\t\t// 显示开关设置,文本开,图形开,光标闪烁关 }
/* 清除显示函数 */ void F12864_clear(void) { \tunsigned int i; \twrite_ddc(0x24,0x00,0x00); \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// 设置地址指针从零开始 \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// 设置地址指针从零开始 \twrite_commond(0xb0); \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// 设置地址指针从零开始 \tfor(i = 0;i < 128 * 64 ;i++)write_date(0x00); \t\t// 清一屏 \twrite_commond(0xb2); \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// 设置地址指针从零开始 \twrite_ddc(0x24,0x00,0x00); \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// 设置地址指针从零开始 }
/* 设定显示地址
- mode 1:图形
-
0:汉字
*/ void goto_xy(uchar x,uchar y,uchar mode) { \t uint temp; \t temp = 128 / 8 * y + x; \t if(mode) \t\t\t\t\t//mode = 1为Graphic \t { \t \t\t temp = temp + 0x0100; \t } \t write_ddc(0x24,temp & 0xff,temp / 256);\t\t//地址指针位置 }
/* 显示一个ASCII码 */ void Putchar(uchar x,uchar y,uchar Charbyte) { \t goto_xy(x,y,TXT); \t write_dc(0xC4,Charbyte-32);\t\t\t\t\t\t\t//数据一次写入 }
void display_string(uchar x,uchar y,uchar *p) { \twhile(*p != 0) \t{ \t\tif(x > 15 ) \t\t//超出一行,自动换行 \t\t{ \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//超出一行,自动换行 \t\t\t\tx = 0; \t\t\t\ty++; \t\t} \t\tPutchar(x,y,*p); \t\t++x; \t\t++p; \t} }
void display_num(uchar x,uchar y,uchar z) { \tuchar z1,z2; \tz1 = num[z / 10]; \tz2 = num[z % 10]; \tPutchar(x,y,z1); \tPutchar(x+1,y,z2); }
/* 显示一串汉字,j=k+n (n,显示字的个数,k,从那个字开始) */ void dprintf_hanzi_string_1(struct typFNT_GB16 code *GB_16,uint X_pos,uint Y_pos,uchar j,uchar k) { \t unsigned int address; \t unsigned char m,n; \t while(k < j) \t { \t \tm = 0; \t \taddress = LcmLengthDots / 8 * Y_pos + X_pos + 0x0800; \t \tfor(n = 0;n < 16;n++) \t\t\t\t\t//计数值16 \t \t{ \t \t\twrite_ddc(0x24,(uchar)(address),(uchar)(address>>8)); //设置显示存储器地址 \t \t\twrite_dc(0xc0,GB_16[k].Mask[m++]); //写入汉字字模左部 \t \t\twrite_dc(0xc0,GB_16[k].Mask[m++]); \t//写入汉字字模右部 \t \t\taddress = address + 128/8; //修改显示存储器地址,显示下一列(共16列) \t \t} \t \tX_pos += 2; \t \tk++; \t } }
原文地址: https://www.cveoy.top/t/topic/oQUo 著作权归作者所有。请勿转载和采集!