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

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

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

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

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

PIC单片机C语言编程实例

CompanyDocumentnumber:

WTUT-WT88Y-W8BBGB-BWYTT-19998

 

PIC单片机C语言编程实例

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

15.2.2MG-12232模块的编程

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

液晶显示区域分成E1边和E2边,下面只含E1边的程序(表中E1=1,E2=0),E2边(表中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=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口

RB0=0;//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;//如果液晶没被关闭,则继续关

}

}

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

汉字。

曲线等。

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

初始化的顺序为:

关显示→正常显示驱动设置→占空比设置→复位→ADC选择→清屏→开显示,程序如下:

//E1边初始化

voidlcd1()

{

DISOFF1();//关显示E1

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

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

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

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

TRANS=0XE2;//复位

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

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

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

CLEAR1();//清屏

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

DISP1();//开显示

}

程序清单

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

注意在调试该程序时,需把模板上的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口

RB0=0;//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;//如果液晶没被关闭,则继续关

}

}

//E1边初始化

voidlcd1()

{

DISOFF1();//关显示E1

TRANS=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=0

RA3=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=0

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

}

}

//E2边初始化

voidlcd2()

{

DISOFF2();//关显示E1

TRANS=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<>

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

unsignedchars0,s1,s2,s3;

//定义秒。

秒。

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,0X00,0X10};

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

//TMR0初始化子程序

voidtmint()

{

T0CS=0;//TMR0工作于定时器方式

PSA=1;//TMR0不用分频

T0IF=0;//清除TMR0的中断标志

T0IE=1;//TMR0中断允许

}

//spi显示初始化子程序

voidSPIINIT()

{

PIR1=0;

SSPCON=0x30;

SSPSTAT=0xC0;

//设置SPI的控制方式,允许SSP方式,并且时钟下降沿发送。

与"74HC595,当其

//SCLK从低到高跳变时,串行输入寄存器"的特点相对应

TRISC=0xD7;//SDO引脚为输出,SCK引脚为输出

TRISA5=0;//RA5引脚置为输出,输出显示锁存信号

}

//系统其它部分初始化子程序

voidinitial()

{

TRISB1=0;

TRISB2=0;

TRISB4=1;

TRISB5=1;//设置与键盘有关的各口的输入输出方式

RB1=0;

RB2=0;//建立键盘扫描的初始条件

}

//SPI传输数据子程序

voidSPILED(data)

{

SSPBUF=da

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

当前位置:首页 > 工程科技 > 能源化工

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

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