PIC单片机C语言编程实例.docx

上传人:b****4 文档编号:3583352 上传时间:2022-11-24 格式:DOCX 页数:31 大小:25.97KB
下载 相关 举报
PIC单片机C语言编程实例.docx_第1页
第1页 / 共31页
PIC单片机C语言编程实例.docx_第2页
第2页 / 共31页
PIC单片机C语言编程实例.docx_第3页
第3页 / 共31页
PIC单片机C语言编程实例.docx_第4页
第4页 / 共31页
PIC单片机C语言编程实例.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

PIC单片机C语言编程实例.docx

《PIC单片机C语言编程实例.docx》由会员分享,可在线阅读,更多相关《PIC单片机C语言编程实例.docx(31页珍藏版)》请在冰豆网上搜索。

PIC单片机C语言编程实例.docx

PIC单片机C语言编程实例

PIC单片机C语言编程实例——液晶显示模块编程

15.2.2MG-12232模块的编程

下面以图15.1的接口电路为例。

液晶显示区域分成E1边和E2边,下面只含E1边的程序(表15.1中E1=1,E2=0),E2边(表15.1中E1=0,E2=1)类推。

在系统程序的初始化部分,应对程序中用到的寄存器和临时变量作说明,如:

unsignedcharTRANS;unsignedcharPAGEADD;//存放页地址寄存器unsignedcharPAGENUM;//存放总页数寄存器unsignedcharCLMSUM;//存放总列数寄存器unsignedcharCLMADD;//存放列地址寄存器unsignedcharWRITE;//存放显示数据寄存器unsignedcharrow;//存放显示起始行寄存器unsignedchari,k;//通用寄存器//系统各口的输入输出状态初始化子程序voidINITIAL()

{

ADCON1=0X87;//设置PORTA口和PORTE口为数字I/O口

TRISA3=0;

TRISB0=0;TRISE=0X00;//设置液晶的4个控制脚为输出}

//读液晶显示器状态子程序

voidLCDSTA1()

{

while

(1){

TRISD=0XFF;//设置D口为输入

RB0=1;//E1=1RA3=0;//E2=0

RE0=1;//R/W=1RE1=0;//A0=0if(RD7==0)break;//为忙状态,则继续等待其为空闲}

}

//对液晶显示器发指令子程序(指令保存在TRANS寄存器中)voidTRANS1()

{

LCDSTA1();//判断液晶是否为忙TRISD=0X00;//置D口为输出

RB0=1;//E1=1

RA3=0;//E2=0

RE0=0;//R/W=0

RE1=0;//A0=0

PORTD=TRANS;//需要写入的命令字送入数据线RB0=0;//E1=0写入指令

RE0=1;//R/W=1

}

//对液晶显示器写数据子程序(数据保存在WRITE寄存器中)voidWRITE1()

{

TRANS=CLMADD;//设置列地址

TRANS1();

LCDSTA1();//查询液晶是否为空闲TRISD=0X00;//D口为输出

RB0=1;//E1=1

RA3=0;//E2=0

RE0=0;//R/W=0

RE1=1;//A0=1

PORTD=WRITE;//需要写入的数据放入D口

RBO=O;〃E1=0,写入数据

CLMADD++;//列地址加1

RE0=1;//R/W=1

}

//开E1显示子程序

voidDISP1()

{

while

(1)

{

TRANS=0XAF;

TRANS1();//送出控制命令

LCDSTA1();//判断液晶是否为空闲

TRISD=0XFF;//设置D口为输入

RB0=1;//E1=1

RA3=0;//E2=0

RE0=1;//R/W=1

RE1=0;//A0=0

if(RD5==0)break;//如果液晶没被关闭,则继续关

}

}

//E1边清屏子程序

voidCLEAR1()

{

PAGEADD=0xB8;//设置页地址代码

for(PAGENUM=0X04;PAGENUM>0;PAGENUM-){

TRANS=PAGEADD;

TRANS1();

CLMADD=0x00;//设置起始列for(CLMSUM=0X50;CLMSUM>0;CLMSUM-){

LCDSTA1();//判断液晶是否为空闲

WRITE=0X00;

WRITE1();//写入00H以清屏

}

PAGEADD++;//页号增1

}

}

//关E1显示子程序

voidDISOFF1()

{

while

(1)

{

TRANS=0XAE;

TRANS1();//发出控制命令

LCDSTA1();//判断液晶是否为空闲

TRISD=0XFF;//D口设置为输入

RB0=1;//E1=1

RA3=0;//E2=0

RE0=1;//R/W=1

RE1=0;//A0=0

if(RD5==1)break;//如果液晶没被关闭,则继续关

}

}

有了以上的通用子程序,就可以构造出各种显示程序,如字符。

汉字。

曲线等。

执行这些程序前,必须对液晶进行初始化。

初始化的顺序为:

关显示T正常显示驱动设置T占空比设置T复位

fADC选择t清屏t开显示,程序如下:

//E1边初始化

voidlcd1()

{

DISOFF1();//关显示E1

TRANS=0XA4;//静态显示驱动

TRANS1();//发出控制命令

TRANS=0XA9;//占空比为1/32

TRANS1();//发出控制命令

TRANS=0XE2;//复位

TRANS1();//发出控制命令

TRANS=0XA0;//ADC选择正常输出

TRANS1();//发出控制命令

CLEAR1();//清屏

LCDSTA1();//判断液晶是否为空闲

DISP1();//开显示

}

15.4程序清单

下面给出一个已经在模板上调试通过的程序。

注意在调试该程序时,需把模板上的J9跳针短接。

#include

//该程序用于液晶显示功能的演示

//运行程序后,液晶上显示"电流有效值"和"电压有效值"字样//系统总的初始化子程序unsignedcharTRANS;

unsignedcharPAGEADD;//存放页地址寄存器unsignedcharPAGENUM;//存放总页数寄存器unsignedcharCLMSUM;//存放总列数寄存器unsignedcharCLMADD;//存放列地址寄存器unsignedcharWRITE;//存放显示数据寄存器unsignedcharrow;//存放显示起始行寄存器unsignedchari,k;//通用寄存器constchartable[192]={0X00,0XF8,0X48,0X48,0X48,0X48,0XFF,0X48,0X48,0X48,0X48,0XFC,0X08,0X00,0X00,0X00,0X00,0X07,0X02,0X02,0X02,0X02,0X3F,0X42,0X42,0X42,0X42,0X47,0X40,0X70,0X00,0X00,//"电"0X00,0X00,0XFE,0X02,0X82,0X82,0X82,0X82,0XFE,0X82,0X82,0X82,0XC3,0X82,0X00,0X00,0X40,0X30,0X0F,0X40,0X40,0X40,0X40,0X40,

0X7F,0X40,0X42,0X44,0X4C,0X60,0X40,0X00,//"压"0X04,0X04,0X04,0X84,0XE4,0X3C,0X27,0X24,0X24,0X24,0X24,0XF4,0X24,0X06,0X04,0X00,0X4,0X2,0X1,0X0,0XFF,0X9,0X9,0X9,

0X9,0X49,0X89,0X7F,0X0,0X0,0X0,0X0,//"有"0X88,0X48,0XB8,0X9,0XA,0X98,0X2C,0X48,0X20,0XD0,0X1F,0X10,0X10,0XF8,0X10,0X0,0X40,0X20,0X18,0X5,0X2,0XD,0X30,0X80,0X80,0X41,0X36,0X8,0X37,0XC0,0X40,0X0,//"效"0X80,0X40,0X20,0XF8,0X7,0X4,0XE4,0XA4,0XA4,0XBF,0XA4,0XA4,0XF6,0X24,0X0,0X0,0X0,0X0,0X0,0XFF,0X40,0X40,0X7F,0X4A,0X4A,0X4A,0X4A,0X4A,0X7F,0X40,0X40,0X0,//"值"

0X10,0X22,0X64,0XC,0X80,0X44,0X44,0X64,0X55,0X4E,0X44,0X54,0X66,0XC4,0X0,0X0,0X4,0X4,0XFE,0X1,0X0,0X80,0X40,0X3F,

0X0,0XFF,0X0,0X3F,0X40,0X40,0X70,0X0//"流"};

//系统各口的输入输出状态初始化子程序

voidINITIAL()

{

ADCON1=0X87;//设置PORTA口和PORTE口为数字I/O口TRISA3=0;

TRISB0=0;

TRISE=0X00;//设置液晶的4个控制脚为输出

}

//读液晶显示器状态子程序

voidLCDSTA1()

{

while

(1){

TRISD=0XFF;//设置D口为输入

RB0=1;//E1=1

RA3=0;//E2=0

RE0=1;//R/W=1

RE1=0;//A0=0

if(RD7==0)break;//为忙状态,则继续等待其为空闲

}

}

//对液晶显示器发指令子程序(指令保存在TRANS寄存器中)

voidTRANS1()

{

LCDSTA1();//判断液晶是否为忙TRISD=0X00;//D口为输出

RB0=1;//E1=1

RA3=0;//E2=0

RE0=0;//R/W=0

RE1=0;//A0=0

PORTD=TRANS;//需要写入的命令字送入数据线

RB0=0;//E1=0写入指令

RE0=1;//R/W=1

}

//对液晶显示器写数据子程序(数据保存在WRITE寄存器中)

voidWRITE1()

{

TRANS=CLMADD;//设置列地址

TRANS1();

LCDSTA1();//查询液晶是否为空闲

TRISD=0X00;//D口为输出

RB0=1;//E1=1

RA3=0;//E2=0

RE0=0;//R/W=0

RE1=1;//A0=1

PORTD=WRITE;//需要写入的数据放入D口

RBO=O;〃E1=0,写入数据

CLMADD++;//列地址加1

RE0=1;//R/W=1

}

//开E1显示子程序

voidDISP1()

{

while

(1){

TRANS=0XAF;

TRANS1();//送出控制命令

LCDSTA1();//判断液晶是否为空闲

TRISD=0XFF;//设置D口为输入

RB0=1;//E1=1

RA3=0;//E2=0

RE0=1;//R/W=1

RE1=0;//A0=0if(RD5==0)break;//如果液晶没被关闭,则继续关}

}

//E1边清屏子程序

voidCLEAR1()

{

PAGEADD=0xB8;//设置页地址代码for(PAGENUM=0X04;PAGENUM>0;PAGENUM-){TRANS=PAGEADD;

TRANS1();

CLMADD=0x00;//设置起始列for(CLMSUM=0X50;CLMSUM>0;CLMSUM-){LCDSTA1();//判断液晶是否为空闲

WRITE=0X00;

WRITE1();//写入00H以清屏}

PAGEADD++;//页号增1

}

}

//关E1显示子程序voidDISOFF1()

{

while

(1){

TRANS=0XAE;

TRANS1();//发出控制命令

LCDSTA1();//判断液晶是否为空闲

TRISD=0XFF;//D口设置为输入

RB0=1;//E1=1

RA3=0;//E2=0

RE0=1;//R/W=1

RE1=0;//A0=0

if(RD5==1)break;//如果液晶没被关闭,则继续关}

}

//E1边初始化

voidlcd1()

{

DISOFF1();//关显示E1TRANS=0XA4;//静态显示驱动

TRANS1();//发出控制命令TRANS=0XA9;//占空比为1/32

TRANS1();//发出控制命令

TRANS=0XE2;//复位

TRANS1();//发出控制命令

TRANS=0XA0;//ADC选择正常输出

TRANS1();//发出控制命令

CLEAR1();//清屏

LCDSTA1();//判断液晶是否为空闲

DISP1();//开显示

}

//E2边的处理部分//读液晶显示器状态子程序voidLCDSTA2(){while

(1){

TRISD=0XFF;//设置D口为输入

RB0=0;//E1=0

RA3=1;//E2=1

RE0=1;//R/W=1

RE1=0;//A0=0

if(RD7==0)break;//为忙状态,则继续等待其为空闲

}

}

//对液晶显示器发指令子程序指令保存在TRANS寄存器中voidTRANS2()

{

LCDSTA2();//判断液晶是否为忙TRISD=0X00;//D口为输出RB0=0;//E1=0RA3=1;//E2=1

RE0=0;//R/W=0

RE1=0;//A0=0

PORTD=TRANS;//需要写入的命令字送入数据线

RA3=0;//E2=0写入指令

RE0=1;//R/W=1

}

//对液晶显示器写数据子程序(数据保存在WRITE寄存器中)voidWRITE2()

{

TRANS=CLMADD;//设置列地址

TRANS2();

LCDSTA2();//查询液晶是否为空闲

TRISD=0X00;//D口为输出

RB0=0;//E1=0

RA3=1;//E2=1

RE0=0;//R/W=0

RE1=1;//A0=1

PORTD=WRITE;//需要写入的数据放入D口

RA3=0;//E2=0,写入数据

CLMADD++;//列地址加1

RE0=1;//R/W=1

}

//开E2显示子程序

voidDISP2()

{

while

(1){

TRANS=0XAF;

TRANS2();//送出控制命令

LCDSTA2();//判断液晶是否为空闲

TRISD=0XFF;//设置D口为输入

RB0=0;//E1=0

RA3=1;//E2=1

RE0=1;//R/W=1

RE1=0;//A0=0

if(RD5==0)break;//如果液晶没被关闭,则继续关

}

}

//E2边清屏子程序

voidCLEAR2()

{

PAGEADD=0xB8;//设置页地址代码for(PAGENUM=0X04;PAGENUM>0;PAGENUM-){TRANS=PAGEADD;

TRANS2();

CLMADD=0x00;//设置起始列for(CLMSUM=0X50;CLMSUM>0;CLMSUM-){LCDSTA2();//判断液晶是否为空闲

WRITE=0X00;

WRITE2();//写入00H以清屏

}

PAGEADD++;//页号增1

}

}

//关E2显示子程序

voidDISOFF2()

{

while

(1){

TRANS=0XAE;

TRANS2();//发出控制命令

LCDSTA2();//判断液晶是否为空闲

TRISD=0XFF;//D口设置为输入

RB0=0;//E1=0

RA3=1;//E2=1

RE0=1;//R/W=1

RE1=0;//A0=0if(RD5==1)break;//如果液晶没被关闭,则继续关

}

}

//E2边初始化

voidlcd2()

{

DISOFF2();//关显示E1TRANS=0XA4;//静态显示驱动

TRANS2();//发出控制命令

TRANS=0XA9;//占空比为1/32

TRANS2();//发出控制命令

TRANS=0XE2;//复位

TRANS2();//发出控制命令

TRANS=0XA0;//ADC选择正常输出

TRANS2();//发出控制命令

CLEAR2();//清屏

LCDSTA2();//判断液晶是否为空闲

DISP2();//开显示

}

//LCD的E1边显示函数,调用一次该函数,则在相应的位置显示相应的字voiddis1()

{

TRANS=row;

TRANS1();

TRANS=PAGEADD;

TRANS1();i=i*32;//i变成数组指示指针for(k=0;k<16;k++){

WRITE=table[i+k];//查得需要显示的字节

WRITE1();//在WRITE1子程序里面,列地址加1

}

CLMADD=CLMADD-16;//恢复列地址

PAGEADD=PAGEADD+1;//页地址加1

TRANS=PAGEADD;

TRANS1();

for(;k<32;k++){

WRITE=table[i+k];//查得需要显示的字节

WRITE1();//在WRITE1子程序里面,列地址已经加1

}

}

//LCD的E2边显示函数,调用一次该函数,则在相应的位置显示相应的字voiddis2()

{

TRANS=row;

TRANS2();

TRANS=PAGEADD;

TRANS2();

i=i*32;//i变成数组指示指针for(k=0;k<16;k++){WRITE=table[i+k];//查得需要显示的字节

WRITE2();//在WRITE1子程序里面,列地址已经加1}

CLMADD=CLMADD-16;//恢复列地址

PAGEADD=PAGEADD+1;//页地址加1

TRANS=PAGEADD;

TRANS2();

for(;k<32;k++){

WRITE=table[i+k];//查得需要显示的字节

WRITE2();//在WRITE1子程序里面,列地址已经加1

}

}

//主程序

main()

{

INITIAL();//系统初始化lcd1();//E1边初始化lcd2();//E2边初始化row=0XC0;//显示起始列为第0行

//以下显示不同的字符

PAGEADD=0XB8;//显示起始页为第0页

CLMADD=0X00;//起始列为第0列

i=0;//显示数组中对应的第一个字dis1();//调用显示函数

PAGEADD=0XB8;//显示起始页为第0页CLMADD=16;//起始列为第16列i=1;//显示数组中对应的第二个字

dis1();//调用显示函数

PAGEADD=0XB8;//显示起始页为第0页

CLMADD=32;//起始列为第32列

i=2;//显示数组中对应的第三个字

dis1();//调用显示函数

PAGEADD=0XB8;//显示起始页为第0页

CLMADD=48;//起始列为第48列

i=3;//显示数组中对应的第四个字

dis1();//调用显示函数

PAGEADD=0XB8;//显示起始页为第0页

CLMADD=0;//起始列为第0列

i=4;//显示数组中对应的第五个字

dis2();//调用E2边显示函数

PAGEADD=0XBA;//显示起始页为第2页

CLMADD=0X00;//起始列为第0列

i=0;//显示数组中对应的第一个字

dis1();//调用显示函数

PAGEADD=0XBA;//显示起始页为第2页

CLMADD=16;//起始列为第16列

i=5;//显示数组中对应的第六个字

dis1();//调用显示函数

PAGEADD=0XBA;//显示起始页为第2页

CLMADD=32;//起始列为第32列

i=2;//显示数组中对应的第三个字

dis1();//调用显示函数

PAGEADD=0XBA;//显示起始页为第2页

CLMADD=48;//起始列为第48列

i=3;//显示数组中对应的第四个字

dis1();//调用显示函数

PAGEADD=0XBA;//显示起始页为第2页

CLMADD=0;//起始列为第0列

i=4;//显示数组中对应的第五个字

dis2();//调用E2边显示函数

while

(1){

}

}

PIC单片机C语言编程实例——秒表

程序清单

该源程序已在实验板上调试通过,读者可直接引用,并可利用软件编程的灵活性,加以拓展,实现更为复杂的功能。

#include

#include

//此程序实现计时秒表功能,时钟显示范围00.00〜99.99秒,分辨度:

0.01秒

unsignedchars0,s1,s2,s3;

//定义0.01秒。

0.1秒。

1秒。

10秒计时器

unsignedchars[4];

unsignedchark,data,sreg;unsignedinti;

consttable[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90};

//不带小数点的显示段码表

consttable0[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1