点阵式液晶显示屏的显示程序设计单片机课程设计报告.docx
《点阵式液晶显示屏的显示程序设计单片机课程设计报告.docx》由会员分享,可在线阅读,更多相关《点阵式液晶显示屏的显示程序设计单片机课程设计报告.docx(42页珍藏版)》请在冰豆网上搜索。
点阵式液晶显示屏的显示程序设计单片机课程设计报告
JIANGSUUNIVERSITY
单片机原理及应用
课程设计
学院名称:
计算机科学与通信工程
专业班级:
通信1002
学生姓名:
马彩霞
学生学号:
3100601033
指导教师姓名:
赵念强
2013年1月
点阵式液晶显示屏地显示程序设计
一、设计目地
1.熟练掌握C51系统仿真开发系统地应用.
2.加强单片机地综合运用能力、提高单片机地软件编程和调试能力,为以后地学习和开发工作打下良好基础.
3.掌握地液晶地工作原理以及应用设计.
4.掌握小系统开发设计地流程以及设计思路.
二、设计方案
实验要求:
1)从下到上左到右滚动显示:
自己设计地图片
2)能进行正常地模拟量采样值显示(温度、压力、电位).
3)未按键时菜单要可以停下来
设计思路:
由于实验指导书中做过液晶显示和模数转换得实验,根据两个实验地功能实现和流程原理进行设计
将程序分成四个模块:
主函数模块main.c
模数转换模块ADC.c
液晶显示模块KS0108.c
按键调试模块Test7179.c
其中让主函数模块做一些初始化和函数调用工作,模数转换模块主要是将温度,压力,点位地值转化为数字量供液晶显示用,液晶显示模块得到模数转换模块传递过来地数字量显示到液晶面板上,按键调试模块是输入按键显示温度,电压,压力等.
程序流程图:
1系统主流程图如下
开始
主函数模块
显示模块
模数转换模块
2主函数流程图
3显示模块流程图
4模数转换模块流程图
主要地源程序及注释
主函数:
#include"c8051f020.h"
#include
voidDelay1us(unsignedcharus)
{
while(us)
{
_nop_()。
_nop_()。
_nop_()。
_nop_()。
_nop_()。
--us。
}
}
voidSYSCLK_Init(void)
{
inti。
//delaycounter
OSCXCN=0x67。
//startexternaloscillatorwith
//18.432MHzcrystal
for(i=0。
i<256。
i++)。
//Waitforosc.tostartup
while(!
(OSCXCN&0x80))。
//Waitforcrystalosc.tosettle
OSCICN=0x88。
//selectexternaloscillatorasSYSCLK
//sourceandenablemissingclock
//detector
//OSCICN=0x07。
file:
//interal16MHZ
}
#definePRT0CFP0MDOUT
#definePRT1CFP1MDOUT
#definePRT2CFP2MDOUT
voidPORT_Init(void)
{
XBR0=0x07。
//EnableSMBus,SPI0,andUART0
XBR1=0x00。
XBR2=0x44。
//Enablecrossbarandweakpull-ups
EMI0CF=0x27。
EMI0TC=0x21。
P74OUT=0xFF。
P0MDOUT=0x15。
P1MDOUT|=0x3C。
//P1.2-P1.5推挽输出
P1&=0xc3。
//P1.2-P1.5=0
}
voidSPI0_Init(void)
{
SPI0CFG=0x07。
//datasampledon1stSCKrisingedge
//8-bitdatawords
SPI0CFG|=0xC0。
//CKPOL=1。
SPI0CN=0x03。
//Mastermode。
SPIenabled。
flags
//cleared
SPI0CKR=SYSCLK/2/8000000-1。
//SPIclock<=8MHz(limitedby
//EEPROMspec.)
}
unsignedcharCount1ms。
voidTimer0_Init(void)
{
CKCON|=0x8。
TMOD|=0x1。
//16Bit
Count1ms=10。
TR0=0。
//STOPTimer0
TH0=(-SYSCLK/1000)>>8。
//setTimer0tooverflowin1ms
TL0=-SYSCLK/1000。
TR0=1。
//STARTTimer0
IE|=0x2。
}
voidTimer0_ISR(void)interrupt1//1ms
{
TH0=(-SYSCLK/1000)>>8。
TL0=-SYSCLK/1000。
if(Count1ms)Count1ms--。
}
voidDelay1ms(unsignedcharT)
{
Count1ms=T。
while(Count1ms)。
}
voidDelay1s(unsignedcharT)
{
while(T)
{
Delay1ms(200)。
Delay1ms(200)。
Delay1ms(200)。
Delay1ms(200)。
Delay1ms(200)。
T--。
}
}
charGetKeyValue(void)。
voidinit_adc(void)。
unsignedintGetADCValue(charNo)。
voidTestLCD(void)。
voidDispLCD(char*DispBuf,charnum)。
voidInitLCD(void)。
//初始化¯LCD
voidShowWenDu(void)。
voidTest7279(bitLoopFlag)。
voidmain(void)
{
unsignedintw。
charNo,i,buf[5]。
No=1。
WDTCN=0xde。
WDTCN=0xad。
//关看门狗
SYSCLK_Init()。
//初始化时钟
Timer0_Init();//初始化定时器
PORT_Init()。
//初始化IO口
SPI0_Init()。
//初始化SPI0
init_adc()。
CPT1CN|=0x80。
//使能比较器1
REF0CN=0x07。
//使能片内参考电压
DAC0CN|=0x80。
//使能DAC0
DAC0H=0。
DAC0L=0。
EA=1。
//开中断
//Test7279(0)。
loop:
Test7279(0)。
//关闭数码关显示
TestLCD()。
InitLCD()。
No=0。
//w=GetADCValue
(1)。
for(。
。
)
{
i=GetKeyValue()。
if((i>=0)&&(i<=3))
{
No=i。
switch(No)
{
case1:
ShowWenDu()。
break。
case2:
ShowDianYa()。
break。
case3:
ShowYaLi()。
break。
case0:
gotoloop。
break。
default:
break。
}
}
w=GetADCValue(No)。
Delay1ms(30)。
switch(No)
{
case1:
buf[0]=(w%10000)/1000。
buf[1]=(w%1000)/100。
buf[2]=''。
buf[3]=(w%100)/10。
buf[4]=(w%10)。
DispLCD(buf,1)。
showdu()。
break。
case2:
buf[0]=(w%10000)/1000。
buf[1]=(w%1000)/100。
buf[2]=''。
buf[3]=(w%100)/10。
buf[4]=(w%10)。
DispLCD(buf,2)。
showfu()。
break。
case3:
buf[0]=(w%10000)/1000。
buf[1]=(w%1000)/100。
buf[2]=''。
buf[3]=(w%100)/10。
buf[4]=(w%10)。
DispLCD(buf,3)。
showniu()。
break。
default:
break。
}}}
模数转换
#include"c8051F020.h"
#include
/*
压力应变片ADC实验
*/
#defineMUX_TEMP0x08
#defineMUX_VOLT0x01
#defineMUX_PRESS0x02
unsignedintidataTemp,Press,Volt。
unsignedcharidatamux_select。
sfr16ADC0=0xbe。
//ADC0data
voidinit_adc(void)
{
ADC0CN=0x81。
//ADC0enabled。
normaltracking
//mode。
ADC0conversionsareinitiated
//onwritetoAD0BUSY。
ADC0datais
//left-justified
REF0CN=0x07。
//enabletempsensor,on-chipVREF,
//andVREFoutputbuffer
mux_select=MUX_TEMP。
//CPUon-chiptempsensor
AMX0SL=MUX_TEMP。
ADC0CF=(SYSCLK/2500000)<<3。
//ADCconversionclock=2.5MHz
//ADC0CF|=0x01。
//PGAgain=2
EIE2&=~0x02。
//disableADC0EOCinterrupt
EIE1&=~0x04。
//disableADC0windowcompareinterrupt
}
//On-chiptemperature
//AN1.电位片
//AN2.应变片
voidread_analog_inputs(void)
{
longtemp_long。
AD0INT=0。
//clearconversioncompleteindicator
AD0BUSY=1。
//initiateconversion
while(AD0INT==0)。
//waitforconversioncomplete
switch(mux_select)
{
caseMUX_TEMP:
temp_long=ADC0-42380/2。
temp_long=(temp_long*200L)/156。
Temp=temp_long。
AMX0SL=MUX_VOLT。
//SelectAIN1fornextread
mux_select=MUX_VOLT。
break。
caseMUX_VOLT:
temp_long=ADC0。
Volt=24*temp_long/655。
AMX0SL=MUX_PRESS。
//Selecton-chiptempsensor
mux_select=MUX_PRESS。
break。
caseMUX_PRESS:
temp_long=ADC0。
temp_long=24*temp_long/655。
Press=temp_long。
AMX0SL=MUX_TEMP。
mux_select=MUX_TEMP。
break。
default:
AMX0SL=MUX_TEMP。
mux_select=MUX_TEMP。
break。
}
}
unsignedintGetADCValue(charNo)
{
read_analog_inputs()。
read_analog_inputs()。
read_analog_inputs()。
switch(No)
{
case1:
returnTemp。
case2:
returnVolt。
case3:
if(Press<10)Press=0。
returnPress。
}
}
液晶显示模块KS0108.c
#include"C8051F020.h"
#include
/*
液晶点阵显示实验-128*64,控制器KS0108
实验准备:
将拨码开关S1和S2置ON
运行此程序将上下左右滚动显示“姓名,马彩霞学号,3100601033班级,通信1002”
出现菜单,按键选择.
*/
#defineLCD_DATAP2
#defineLCD_RSP30
#defineLCD_RWP31
#defineLCD_EP32
#defineLCD_CS1P34
#defineLCD_CS2P33
#defineLCD_RSTP35
voidDelay1ms(unsignedchar)。
#defineSELECTCS0
charcodezero[]={//0//
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
}。
charcodeone[]={//1//
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
}。
charcodetwo[]={//2//
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
}。
charcodethree[]={//3//
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
}。
charcodefour[]={//4//
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
}。
charcodefive[]={//5//
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
}。
charcodesix[]={//6//
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
}。
charcodeseven[]={//7//
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
}。
charcodeeight[]={//8//
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
}。
charcodenine[]={//9//
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,
}。
charcodemao[]={//:
//
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,
}。
charcodedot[]={//.//
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,
}。
charcodewen[]={//温//
0x10,0x21,0x86,0x70,0x00,0x7E,0x4A,0x4A,0x4A,0x4A,0x4A,0x7E,0x00,0x00,0x00,0x00,
0x02,0xFE,0x01,0x40,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x40,0x00,
}。
charcodedu[]={//度//
0x00,0x00,0xFC,0x04,0x24,0x24,0xFC,0xA5,0xA6,0xA4,0xFC,0x24,0x24,0x24,0x04,0x00,
0x80,0x60,0x1F,0x80,0x80,0x42,0x46,0x2A,0x12,0x12,0x2A,0x26,0x42,0xC0,0x40,0x00,
}。
charcodedian[]={//电//
0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00,
0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00,
}。
charcodeya[]={//压//
0x00,0x00,0xFE,0x02,0x42,0x42,0x42,0x42,0xFA,0x42,0x42,0x42,0x62,0x42,0x02,0x00,
0x20,0x18,0x27,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x21,0x2E,0x24,0x20,0x20,0x00,
}。
charcodeli[]={//力//
0x00,0x10,0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,
0x00,0x00,0x80,0x40,0x20,0x18,0x06,0x01,0x00,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,
}。
charcodeC[]={//C//
0xC7,0x35,0x0F,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,
}。
charcodeN[]={//牛顿//
0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,
}。
charcodem[]={//m//
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,}。
charcodeV[]={//V//
0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,}。
charcodescreen1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x00,0x00,0x00,0x00,
0xC0,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x80,0x80,0x00,0x80,0xC0,0x80,0x80,0x80,
0x00,0x00,0x00,0xC0,0x00,0x00,0x80,0x80,0x80,0xC0,0x80,0x00,0x00,0x00,0x00,0x40,
0x80,0x40,0x80,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x40,0x40,0xC0,0x80,0x80,0x80,
0xC0,0x80,0x80,0x80,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,0x00,0x00,0x00,0x000x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xFC,0x80,0x40,0x04,0x04,0x040xFF,0x04,0x04,0x04,0x00,0x82,0