基于Proteus学习单片机系列(十一) 您所在的位置:网站首页 下载软件的功能叫什么名字 基于Proteus学习单片机系列(十一)

基于Proteus学习单片机系列(十一)

2024-07-14 00:39| 来源: 网络整理| 查看: 265

获取更多资源,请关注微信公众号:嵌入式基地

获取项目资源:公众号后台回复:单片机仿真

基于Proteus学习单片机系列(一)——点亮LED

基于Proteus学习单片机系列(二)——驱动数码管

基于Proteus学习单片机系列(三)——按键

基于Proteus学习单片机系列(四)——中断

基于Proteus学习单片机系列(五)——定时器实现电子表

基于Proteus学习单片机系列(六)——I2C总线AT24C04

基于Proteus学习单片机系列(七)——实时时钟DS1302

基于Proteus学习单片机系列(八)——AD转换及其应用--TLC549

基于Proteus学习单片机系列(九)——DA转换及其应用--TLC5615

基于Proteus学习单片机系列(十)——LCD1602

基于Proteus学习单片机系列(十一)——LCD12864

项目下载

    点击下载

    1.0 电路图

    2.0 程序

            还是只贴出驱动,完整例程可在上面下载。

#include #include #define uchar unsigned char #define uint unsigned int uchar num[] = "0123456789"; sbit REST = P2^0; //Reset signal, active"L" sbit C_D = P2^1; //L:data H:code sbit C_E = P2^2; //Chip enable signal, active"L" sbit R_D = P2^3; //read signal, active"L" sbit W_R = P2^4; //write signal, active"L" #define width 15 //显示区宽度 #define Graphic 1 #define TXT 0 #define LcmLengthDots 128 #define LcmWidthDots 64 /**************************12864液晶的相关函数**********************/ void delay_nms(uint i) { while(i) i--; } void write_commond(uchar com) //对液晶写一个指令 { C_E = 0; C_D = 1; R_D = 1; P0 = com; W_R = 0; // write _nop_(); W_R = 1; // disable write C_E = 1; C_D = 0; } void write_date(uchar dat) //对液晶写一个数据 { C_E = 0; C_D = 0; R_D = 1; P0 = dat; W_R = 0; _nop_(); W_R = 1; C_E = 1; C_D = 1; } void write_dc(uchar com,uchar dat) //写一个指令和一个数据 { write_date(dat); write_commond(com); } //写一个指令和两个数据 void write_ddc(uchar com,uchar dat1,uchar dat2) { write_date(dat1); write_date(dat2); write_commond(com); } //LCD初始化函数 void F12864_init(void) { REST = 0; delay_nms(2000); REST = 1; write_ddc(0x40,0x00,0x00); //设置文本显示区首地址 write_ddc(0x41,128/8,0x00); //设置文本显示区宽度 write_ddc(0x42,0x00,0x08); //设置图形显示区首地址0x0800 write_ddc(0x43,128/8,0x00); //设置图形显示区宽度 write_commond(0xA0); //设置光标形状 8x8方块 write_commond(0x80); //显示方式设置 文本and图形(异或) write_commond(0x92); //设置光标 write_commond(0x9F); //显示开关设置 文本开,图形开,光标闪烁关 } //**************************//清显示存储器函数 void F12864_clear(void) { unsigned int i; write_ddc(0x24,0x00,0x00); //置地址指针为从零开始 write_commond(0xb0); //自动写 for(i = 0;i < 128 * 64 ;i++)write_date(0x00); //清一屏 write_commond(0xb2); //自动写结束 write_ddc(0x24,0x00,0x00); //重置地址指针 } //设定显示的地址 void goto_xy(uchar x,uchar y,uchar mode) { uint temp; temp = 128 / 8 * y + x; if(mode) //mode = 1为Graphic { //如果图形模式要加上图形区首地址0x0800 temp = temp + 0x0100; } write_ddc(0x24,temp & 0xff,temp / 256); //地址指针位置 } //显示一个ASCII码函数 void Putchar(uchar x,uchar y,uchar Charbyte) { goto_xy(x,y,TXT); write_dc(0xC4,Charbyte-32); //数据一次读写方式//查字符rom } void display_string(uchar x,uchar y,uchar *p) { while(*p != 0) { if(x > 15 ) //自动换行 128*64 { x = 0; y++; } Putchar(x,y,*p); ++x; ++p; } } void display_num(uchar x,uchar y,uchar z) { uchar z1,z2; z1 = num[z / 10]; z2 = num[z % 10]; Putchar(x,y,z1); Putchar(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) { unsigned int address; unsigned char m,n; while(k < j) { m = 0; address = LcmLengthDots / 8 * Y_pos + X_pos + 0x0800; for(n = 0;n < 16;n++) //计数值16 { write_ddc(0x24,(uchar)(address),(uchar)(address>>8)); //设置显示存储器地址 write_dc(0xc0,GB_16[k].Mask[m++]); //写入汉字字模左部 write_dc(0xc0,GB_16[k].Mask[m++]); //写入汉字字模右部 address = address + 128/8; //修改显示存储器地址,显示下一列(共16列) } X_pos += 2; k++; } }

 

 

 

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有