STM32综合实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编号:
《嵌入式原理及应用》
实验报告
实验项目:综合实验
专业:电子信息工程
学号:
学生姓名:
指导教师:
时间批次:第13周星期7第4大节第4批次
2020 年5月24日
一、源代码详细注释
#include "stm32f10x.h"
#define Key1 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)
#define Key2 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_10)
unsigned char LCDBuffer[10]={""};
unsigned char LCDBuffer2[12]={" LISONGLIN"};
int msCounter=0;
void SysTick_Handler(void)//--- systick中断函数---
{msCounter++;}
void DelaymS(int t)
{ int ta,tb;ta=tb=msCounter;
while((tb-ta)<t){tb=msCounter;}
}
void Init_LCD_Pin(void)//初始化屏幕引脚、按键引脚、虚拟终端引脚
{ GPIO_InitTypeDef MyGPIO;//定义结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB|RCC_APB2Periph_ GPIOA,ENABLE); //使能PC,PB端口时钟
MyGPIO.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_5 |
GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_13| GPIO_Pin_14 ;
MyGPIO.GPIO_Speed=GPIO_Speed_50MHz; // I/O口频率50Mhz
MyGPIO.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &MyGPIO); //使用MyGPIO参数初始化GPIOB
MyGPIO.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_2 ; //选择引脚
MyGPIO.GPIO_Speed=GPIO_Speed_50MHz; I/O口频率50Mhz
MyGPIO.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(GPIOA,&MyGPIO); //使用MyGPIO参数初始化GPIOA
MyGPIO.GPIO_Pin=GPIO_Pin_10 | GPIO_Pin_2 ; //选择引脚
MyGPIO.GPIO_Speed=GPIO_Speed_50MHz; I/O口频率50Mhz
MyGPIO.GPIO_Mode=GPIO_Mode_IN_FLOATING; //配置IO口为浮空输入模式
GPIO_Init(GPIOC,&MyGPIO); //使用MyGPIO参数初始化GPIOC
}
#define RS_CLR GPIO_ResetBits(GPIOA,GPIO_Pin_2) //设置GPIOB.2输出0,等同PBout(2)=0
#define RS_SET GPIO_SetBits(GPIOA,GPIO_Pin_2) //设置GPIOA.2输出1,等同PAout(2)=1
#define EN_CLR GPIO_ResetBits(GPIOA,GPIO_Pin_1)
#define EN_SET GPIO_SetBits(GPIOA,GPIO_Pin_1)
//LCD1602写指令函数
void LCD_Write_Com(unsigned char com)//写指令
{ int i;
for(i=0; i<1000; i++);
GPIO_Write(GPIOB,(int)(com & 0x03)<<1 |(com&0x0c)<<2 |(com & 0x30)<<4 |(com & 0xc0)<<7);
RS_CLR;EN_SET;EN_CLR;
}
//LCD1602写数据函数
void LCD_Write_Data(unsigned char Data)//写数据
{ int i;
for(i=0; i<1000; i++);
GPIO_Write(GPIOB,(int)(Data & 0x03)<<1 |(Data & 0x0c)<<2 |(Data & 0x30)<<4 |(Data & 0xc0)<<7); RS_SET;EN_SET;EN_CLR;
}
void LCD_Init (void) //LCD1602初始化函数
{ int i;LCD_Write_Com(0x38);//设置成8位驱动,2行5x7点
for(i=0;i<100000;i++);
LCD_Write_Com(0x38);
for(i=0; i<100000; i++);
LCD_Write_Com(0x38);
for(i=0;i<100000;i++);
LCD_Write_Com(0x38);关闭光标
LCD_Write_Com(0x08);//显示模式
LCD_Write_Com(0x01);//不显示光标
LCD_Write_Com(0x06);//清除显示
for(i=0;i<100000;i++);
LCD_Write_Com(0x0C);
}
void LCD_Write_Char(char x, char y, char Data)//显示字符
{ if(0==y)LCD_Write_Com(0x80 + x);
else
LCD_Write_Com(0xC0+x);LCD_Write_Data(Data);
}
long KeyCnt=0;
void keyscan()
{ unsigned char i;
if(Key1==0)
{ DelaymS(10);
if(Key1==0)
{ LCD_Write_Com(0x38);
for(i=0;i<12;i++)LCD_Write_Char(2+i,0,LCDBuffer2[i]);
}
DelaymS(10);//时延
}
if(Key2==0)
{ DelaymS(10);
if(Key2==0){KeyCnt++;}
DelaymS(10);
}
if(KeyCnt==9999)KeyCnt=0;//返回
}
unsigned char LCDBuffer1[]={" KeyCnt=0000"};//虚拟终端初始化显示
int main(void)//主程序
{ unsigned char i=0;
if(SysTick_Config(SystemCoreClock/1000)){while(1);}
Init_LCD_Pin();LCD_Init();
for(i=0;i<14;i++)LCD_Write_Char(i,1,LCDBuffer1[i]);
for(i=0;i<10;i++)LCD_Write_Char(3+i,0,LCDBuffer[i]);
while(1)
{ keyscan();
if(KeyCnt/1000 >0)LCD_Write_Char(10,1,KeyCnt/1000 + '0');
else LCD_Write_Char(10,1,'0');
if((KeyCnt%1000)/100 >0)
LCD_Write_Char(11,1,(KeyCnt%1000 /100) + '0');
else LCD_Write_Char(11,1,'0');
if((KeyCnt%100)/10 >0)
LCD_Write_Char(12,1,(KeyCnt%100)/10 + '0');
else LCD_Write_Char(12,1,'0');
if(KeyCnt%10 >0)
LCD_Write_Char(13,1,KeyCnt%10 + '0');
else LCD_Write_Char(13,1,'0');
}
}
二、程序流程图
三、程序运行过程描述
先定义中断函数和延时函数;
后将屏幕引脚和按键引脚初始化,定义引脚功能,声明结构体,输出模式等参数等,定义虚拟终端输出引脚;
再定义存储数据的寄存器,在寄存器中写入指令和数据;
定义LED显示函数,信号初始化等,然后屏幕显示字符。

定义主函数,将各功能子函数调用运行,并且while(1)运行得出结果,屏幕显示学号,按K1键显示姓名拼音,按K2加计数字,屏幕显示数值变化,同时虚拟终端显示计数变化。

四、相关库函数功能描述
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIO
B,ENABLE);//使能PC,PB端口时钟
GPIO_InitStructure.GPIO_Mode//设置输出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置I/O口速度
GPIO_SetBits(GPIOB,GPIO_Pin_5);//PB.5输出高
GPIO_InitStructure.GPIO_Pin//设置引脚输出方式
GPIO_SetBits(GPIOE,GPIO_Pin_5);//PE.5输出高
GPIO_ResetBits(GPIOA,GPIO_Pin_2)//设置GPIOB.2输出0,等同PBout(2)=0
GPIO_SetBits(GPIOA,GPIO_Pin_2)//设置GPIOA.2输出1,等同PAout(2)=1
LCD_Write_Com(0x38);//设置光标和内容显示等
LCD_Write_Char(charx,chary,charData)//显示字符
五、其它内容
批次四内容
如图8所示,LCD1液晶显示模块(LM016L) 的DO~D7引脚连接到STM32F103R6的PB1~PB14引脚,E和RS引脚连接到PA1和PA2引脚,按键K1和K2分别连接在STM32F103R6的PC4和PC10引脚上,虚拟终端( VIRTUAL TERMINAL)的RXD和TXD分别连接到PA9和PA10引脚。

(1)LCD1液晶显示模块的第1行居中显示完整的学号;
(2) 按下键盘上的“G”键清除第1行显示的学号:。

(3)按下K1按键则在LCD1液晶的第1行居中显示姓名拼音;
(4)按下K2将0~9999的计数数值居中显示在LCD1液晶模块的第2行,同时将该数值发送到虚拟终端,LCD1上显示的格式为“KeyCnt-=XXXX ”,虚拟終端上显示的格式为“Key2 Value = XXXX”。

3.说明:。

(1)液晶显示驱动参考实验五。

(2)按键识别可参考实验二,或者利用查询方法识别按键,利用GPIO. ReadlnputDataBit 函数来实现。

批次二内容
#include "stm32f10x.h"
#define RS_CLR GPIO_ResetBits(GPIOB,GPIO_Pin_9)
#define RS_SET GPIO_SetBits(GPIOB,GPIO_Pin_9)
#define EN_CLR GPIO_ResetBits(GPIOB,GPIO_Pin_8)
#define EN_SET GPIO_SetBits(GPIOB,GPIO_Pin_8)
int KeyCounter = 0;
unsigned char Thousand = 0;
unsigned char Hundred = 0;
unsigned char Ten = 0;
unsigned char Pc = 0;
void Init_GPIO(void)
{ GPIO_InitTypeDef MyGPIO;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
MyGPIO.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 |
GPIO_Pin_8 | GPIO_Pin_9;
MyGPIO.GPIO_Speed = GPIO_Speed_50MHz;
MyGPIO.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &MyGPIO);
MyGPIO.GPIO_Pin=GPIO_Pin_1; //选择引脚
MyGPIO.GPIO_Mode = GPIO_Mode_IN_FLOATING; //配置IO口为浮空输入模式
GPIO_Init(GPIOA,&MyGPIO); //使用MyGPIO参数初始化GPIOA
}
void LCD_Write_Com (unsigned char com)//写命令
{ int i;
for(i=0; i<1000; i++);
GPIO_Write(GPIOB,com);
RS_CLR;EN_SET;EN_CLR;
}
void LCD_Write_Data (unsigned char Data)//写数据
{ int i;
for(i=0; i<1000; i++);
GPIO_Write(GPIOB,Data);
RS_SET;EN_SET;EN_CLR;
}
void LCD_Init(void)
{ int i;
LCD_Write_Com(0x38);
for(i=0; i<100000; i++);
LCD_Write_Com(0x38);
for(i=0; i<100000; i++);
LCD_Write_Com(0x38);
for(i=0; i<100000; i++);
LCD_Write_Com(0x38);LCD_Write_Com(0x08);
LCD_Write_Com(0x01);LCD_Write_Com(0x06);
for(i=0; i<100000; i++);
LCD_Write_Com(0x0C);
}
void LCD_write_Char (char x, char y, char Data)
{ if(0 == y)
LCD_Write_Com(0x80 + x);
else
LCD_Write_Com(0xC0 + x);LCD_Write_Data(Data);
}
void LCD_write_String (char x,char y,char str[], int len)
{ for(int i=0;i<len;i++)
{LCD_write_Char(x+i,y,*(str+i));}
}
void Init_NVIC(void)
{ NVIC_InitTypeDef MyNVIC;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
MyNVIC.NVIC_IRQChannel = EXTI1_IRQn;//选择外部中断通道1
MyNVIC.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级0
MyNVIC.NVIC_IRQChannelSubPriority = 2; //子优先级2
MyNVIC.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&MyNVIC) ;
}
//外部中断初始化函数
void Init_EXTI (void)
{ EXTI_InitTypeDef MyEXTI;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE) ;//使能AFIO时钟
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0 | GPIO_PinSource1) ;//配置中断线
MyEXTI.EXTI_Line = EXTI_Line1; //配置中断线为EXTI_Line0和EXTI_Line1
MyEXTI.EXTI_Mode = EXTI_Mode_Interrupt; //配置为外部中断模式
MyEXTI.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
MyEXTI.EXTI_LineCmd = ENABLE; //使能中断
EXTI_Init ( &MyEXTI) ;
}
//EXTI1中断服务函数
void EXTI1_IRQHandler (void)
{ KeyCounter ++;
if(KeyCounter > 999)
KeyCounter = 0;
LCD_write_Char(10,1,KeyCounter%10+'0');
LCD_write_Char(9,1,KeyCounter%100/10+'0');
LCD_write_Char(8,1,KeyCounter/100+'0');
EXTI_ClearITPendingBit(EXTI_Line1) ; //清楚EXTI_Line1上的中断标志位
}
int main(void)
{ Init_GPIO();Init_NVIC();Init_EXTI();LCD_Init();
LCD_write_String(3,0,"1700200334",10);LCD_write_String(4,1,"key=000",7);
while(1){}
}
/*或者也可用此代码
#include "stm32f10x.h"
#define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)
int cnt=0;
int msCounter = 0;
void SysTick_Handler(void)
{msCounter++;}
void DelaymS(int t)
{ int ta,tb;ta = tb = msCounter;
while((tb - ta) < t)
{tb = msCounter;}
}
void Init_LCD_Pin(void)
{ GPIO_InitTypeDef MyGPIO;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
MyGPIO.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7|
GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_3 | GPIO_Pin_4|
GPIO_Pin_9|GPIO_Pin_8 ;
MyGPIO.GPIO_Speed = GPIO_Speed_50MHz;
MyGPIO.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&MyGPIO);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
MyGPIO.GPIO_Pin =GPIO_Pin_1;
MyGPIO.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&MyGPIO);
}
#define RS_CLR GPIO_ResetBits(GPIOB,GPIO_Pin_9)
#define RS_SET GPIO_SetBits(GPIOB,GPIO_Pin_9)
#define EN_CLR GPIO_ResetBits(GPIOB,GPIO_Pin_8)
#define EN_SET GPIO_SetBits(GPIOB,GPIO_Pin_8)
void LCD_Write_Com(unsigned short int com)
{ int i;
unsigned short int com1,com2,com3,com4,com5,com6,com7,com8;
com1=(com&0x01)<<7;com2=(com&0x02)<<5;
com3=(com&0x04)<<3;com4=(com&0x08)<<1;
com5=(com&0x10)>>1;com6=(com&0x20)>>3;
com7=(com&0x40)>>5;com8=(com&0x80)>>7;
com=com1|com2|com3|com4|com5|com6|com7|com8;
for(i=0;i<1000;i++);
GPIO_Write(GPIOB,com);RS_CLR;EN_SET;EN_CLR;
}
void LCD_Write_Data(unsigned short int Data)
{ int i;
unsigned short int data1,data2,data3,data4,data5,data6,data7,data8;
data1=(Data&0x01)<<7;data2=(Data&0x02)<<5;
data3=(Data&0x04)<<3;data4=(Data&0x08)<<1;
data5=(Data&0x10)>>1;data6=(Data&0x20)>>3;
data7=(Data&0x40)>>5;data8=(Data&0x80)>>7;
Data=data1|data2|data3|data4|data5|data6|data7|data8;
for(i=0;i<1000;i++);
GPIO_Write(GPIOB,Data);RS_SET;EN_SET;EN_CLR;
}
void LCD_Init(void)
{ int i;
LCD_Write_Com(0x38);LCD_Write_Com(0x08);LCD_Write_Com(0x01); for(i=0;i<100000;i++);
LCD_Write_Com(0x06);LCD_Write_Com(0x0C);
}
void LCD_Write_Char(char x,char y,char Data)
{ if (0 == x)LCD_Write_Com(0x80 + y);
else LCD_Write_Com(0xC0 + y);
LCD_Write_Data(Data);
}
char number[10]="";
char lcd2[7]="key=000";
int main(void)
{ if(SysTick_Config(SystemCoreClock / 1000))
{while(1);}
int i,j=0;
Init_LCD_Pin();LCD_Init();
for(i=3;i<13;i++)
{LCD_Write_Char(0,i,number[j]);j++;}
j=0;
for(i=3;i<13;i++)
{LCD_Write_Char(1,i,lcd2[j]);j++;}
int cnt=0;
while(1)
{ if(KEY1==0)
{ DelaymS(10);
if(KEY1==0)
{ while(KEY1==RESET);
cnt++;
if(cnt>999)
{cnt=000;}
LCD_Write_Char(1,7,(cnt/100)%10+'0');
LCD_Write_Char(1,8,(cnt/10)%10+'0');
LCD_Write_Char(1,9,(cnt/1)%10+'0');
}
}
}
}*/
批次三内容
#include "stm32f10x.h"
#include "stdio.h"
#include "tim_init.h"
#include "exit_init.h"
//==========================================================
int msCounter = 0;
void SysTick_Handler(void)//--- systick中断函数---
{msCounter++;}
//==========================================================
void DelaymS(int t)
{ int ta,tb;
msCounter=0;
ta=tb=msCounter;
while((tb - ta) < t){tb = msCounter;}
}
/*初始化屏幕引脚
D0-D7 PA12 PA13 PA14 PA15 PA9 PA8 PA7 PA6
E PA10
RS PA11
*/
void lcd_pin_init()
{ GPIO_InitTypeDef MyGPIO;
//---GPIOA ---
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
MyGPIO.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9|
GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13
| GPIO_Pin_14 | GPIO_Pin_15;
MyGPIO.GPIO_Speed = GPIO_Speed_50MHz;
MyGPIO.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_Init(GPIOA,&MyGPIO);
}
//配置按键引脚PC2 PC10
void gpio_init(void)
{ GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
// 设置GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化¯
}
void pwm_gpio_init()
{ GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// 设置GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
}
#define SHOW_NUM" LSL"//显示学号,一行16个字符void gpio_PC2_isr(void);
void gpio_PC10_isr(void);
void tim_isr(void);
void tim2_isr(void);
int keyCount = 0;
void LCD_Init(void);
void show_char(uint8_t x,uint8_t y,uint8_t ch);
void show_str(uint8_t x,uint8_t y,char *s);
char temp_buf[64];
int up_en = 0;
int main(void)
{ if(SysTick_Config(SystemCoreClock / 1000)){while(1);}
gpio_init();
lcd_pin_init();
pwm_gpio_init();
gpio_exti_init(PC2,LEVEL_HIGH,EDGE_FALL,gpio_PC2_isr);
gpio_exti_init(PC10,LEVEL_HIGH,EDGE_FALL,gpio_PC10_isr);
tim_init(TIM1,50,tim_isr,1);
tim_init(TIM2,300,tim2_isr,1);
LCD_Init();
show_str(0,0,SHOW_NUM);
sprintf(temp_buf," Auto:%4d",keyCount);
show_str(0,1,temp_buf);
while(1){}
}
void gpio_PC2_isr(void)
{up_en = 1;}
void gpio_PC10_isr(void)
{up_en = 0;}
void tim_isr(void)
{ static int i=0;
if(i)
GPIO_SetBits(GPIOB,GPIO_Pin_11);
else
GPIO_ResetBits(GPIOB,GPIO_Pin_11);
i = !i;
}
void tim2_isr()
{ if(up_en)
{ keyCount++;
if(keyCount > 9999 )
keyCount = 0;
}
sprintf(temp_buf," Auto:%4d",keyCount);
show_str(0,1,temp_buf);
}
//E PA10
//RS PA11
#define RS_CLR GPIO_ResetBits(GPIOA,GPIO_Pin_11) #define RS_SET GPIO_SetBits(GPIOA,GPIO_Pin_11) #define EN_CLR GPIO_ResetBits(GPIOA,GPIO_Pin_10) #define EN_SET GPIO_SetBits(GPIOA,GPIO_Pin_10) //D0-D7 PA12 PA13 PA14 PA15 PA9 PA8 PA7 PA6
void LCD_Write_Com(uint8_t com)
{ int i;
uint16_t dat = 0;
dat |= (com&0x0f)<<12;//D0-3
dat |= ((com>>4)&(0x01))<<9;//D4
dat |= ((com>>5)&(0x01))<<8;//D5
dat |= ((com>>6)&(0x01))<<7;//D6
dat |= ((com>>7)&(0x01))<<6;//D7
for(i=0;i<1000;i++);
GPIO_Write(GPIOA,dat);
RS_CLR;EN_SET;EN_CLR;
}
void LCD_Write_Data(uint8_t Data)
{ int i;
uint16_t dat = 0;
dat |= (Data&0x0f)<<12;//D0-3
dat |= ((Data>>4)&(0x01))<<9;//D4
dat |= ((Data>>5)&(0x01))<<8;//D5
dat |= ((Data>>6)&(0x01))<<7;//D6
dat |= ((Data>>7)&(0x01))<<6;//D7
for(i=0;i<1000;i++);
GPIO_Write(GPIOA,dat);
RS_SET;EN_SET;EN_CLR;
}
//1602初始化代码
void LCD_Init(void)
{ DelaymS(100);
LCD_Write_Com(0x38); //设置成8位驱动,2行5x7点DelaymS(5);
LCD_Write_Com(0x08); //关闭显示,关闭光标
LCD_Write_Com(0x06); //进入显示模式
LCD_Write_Com(0x0c); //设置不显示光标
LCD_Write_Com(0x01); //清除显示,把内容清空
}
void set_addr(uint8_t x,uint8_t y) //设置坐标x 0-15 y 0-1 { uint8_t temp=0x80; //默认最高位:D7为1,即以x80开始if(y) //y为第一行?1为第二行
{temp|=0x40;}
temp|=x;
LCD_Write_Com(temp);
}
//在指定位置显示一个字符
void show_char(uint8_t x,uint8_t y,uint8_t ch)
{ set_addr(x,y);
LCD_Write_Data(ch);
}
void show_str(uint8_t x,uint8_t y,char *s)
{ set_addr(x,y);
while(*s)
{LCD_Write_Data(*s++);}
}
批次五内容
#include "stm32f10x.h"
#define Key1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) #define Key2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4) int msCounter = 0;
void SysTick_Handler(void)//--- systickÖжϺ¯Êý ---{msCounter++;}
void DelaymS(int t)
{ int ta,tb;ta=tb=msCounter;
while((tb-ta)<t){tb=msCounter;}
}
void SPI1_Init(void)
{ GPIO_InitTypeDef MyGPIO;
SPI_InitTypeDef MySPI;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
MyGPIO.GPIO_Pin=GPIO_Pin_5 | GPIO_Pin_7;
MyGPIO.GPIO_Speed=GPIO_Speed_50MHz;
MyGPIO.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&MyGPIO);
MyGPIO.GPIO_Pin=GPIO_Pin_6 | GPIO_Pin_10;
MyGPIO.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&MyGPIO);
MyGPIO.GPIO_Pin=GPIO_Pin_11 | GPIO_Pin_12;
MyGPIO.GPIO_Speed=GPIO_Speed_50MHz;
MyGPIO.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&MyGPIO);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
MyGPIO.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_4;
MyGPIO.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB,&MyGPIO);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
MySPI.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
MySPI.SPI_Mode=SPI_Mode_Master;
MySPI.SPI_DataSize=SPI_DataSize_8b;
MySPI.SPI_CPOL=SPI_CPOL_Low;
MySPI.SPI_CPHA=SPI_CPHA_1Edge;
MySPI.SPI_NSS=SPI_NSS_Soft;
MySPI.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
MySPI.SPI_FirstBit=SPI_FirstBit_MSB;
MySPI.SPI_CRCPolynomial=7;
SPI_Init(SPI1,&MySPI);
SPI_Cmd(SPI1,ENABLE);
}
unsigned char SPI_Rw(unsigned char TxData)
{ while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET) ;
SPI_I2S_SendData(SPI1,TxData) ;
while(SPI_I2S_GetFlagStatus (SPI1, SPI_I2S_FLAG_RXNE)==RESET) ;
return SPI_I2S_ReceiveData (SPI1) ;
}
#define RS_CLR GPIO_ResetBits(GPIOA,GPIO_Pin_12)
#define RS_SET GPIO_SetBits(GPIOA,GPIO_Pin_12)
#define EN_CLR GPIO_ResetBits(GPIOA,GPIO_Pin_11) #define EN_SET GPIO_SetBits(GPIOA,GPIO_Pin_11) void LCD_Write_Com(uint8_t com)
{ int i;
uint8_t temp = 0;
temp |=(com & 0x01)<<7;temp |=(com & 0x02)<<5;
temp |=(com & 0x04)<<3;temp |=(com & 0x08)<<1;
temp |=(com & 0x10)>>1;temp |=(com & 0x20)>>3;
temp |=(com & 0x40)>>5;temp |=(com & 0x80)>>7;
for(i=0;i<1000;i++);
SPI_Rw(temp);RS_CLR;EN_SET;EN_CLR;
}
void LCD_Write_Data(uint8_t Data)
{ int i;
uint8_t temp = 0;
temp |=(Data & 0x01)<<7;temp |=(Data & 0x02)<<5;
temp |=(Data & 0x04)<<3;temp |=(Data & 0x08)<<1;
temp |=(Data & 0x10)>>1;temp |=(Data & 0x20)>>3;
temp |=(Data & 0x40)>>5;temp |=(Data & 0x80)>>7;
for(i=0;i<1000;i++);
SPI_Rw(temp);RS_SET;EN_SET;EN_CLR;
}
void LCD_Init (void)
{ int i;
LCD_Write_Com(0x38);
for(i=0; i<100000; i++);
LCD_Write_Com(0x38);
for(i=0; i<100000; i++);
LCD_Write_Com(0x38);
for(i=0; i<100000; i++);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08);
LCD_Write_Com(0x01);
LCD_Write_Com(0x06);
for(i=0; i<100000; i++);
LCD_Write_Com(0x0C);
}
void LCD_Write_Char(char x, char y, char Data)
{ if(0==y)LCD_Write_Com(0x80 + x);
else
LCD_Write_Com(0xC0+x);LCD_Write_Data(Data);
}
unsigned char LCDBuffer[10] = {""};
unsigned char LCDBuffer2[12] = {"xinxiyutongxinxueyuan"};
int KeyCnt=0;
void keyscan()
{ unsigned char i;
if(Key1== 0)
{ DelaymS(10);
if(Key1==0)
{ LCD_Write_Com(0x38);
for(i=0;i<12;i++)
LCD_Write_Char(2+i,0,LCDBuffer2[i]);
}
DelaymS(10);
}
if(Key2==0)
{ DelaymS(10);
if(Key2==0)
{KeyCnt++;}
DelaymS(10);
}
if(KeyCnt==9999)KeyCnt=0;
}
unsigned char LCDBuffer1[] = {" KeyCnt=0000"};
unsigned char LCDBuffer3[]={"0123456789"};
unsigned char LCDBuffer4[]={"ABCDEF"};
int main(void)
{ if(SysTick_Config(SystemCoreClock/1000)){while(1);}
unsigned char i,j=0;
SPI1_Init( );
LCD_Init ( );
for(i=0;i<10;i++)LCD_Write_Char(3+i,0,LCDBuffer[i]);
for(i=0;i<10;i++)LCD_Write_Char(i,1,LCDBuffer1[i]);
while(1)
{ keyscan();
if(KeyCnt/1000>0)LCD_Write_Char(10,1,KeyCnt/1000+'0');
else LCD_Write_Char(10,1,'0');
if((KeyCnt%1000)/100 >0)LCD_Write_Char(11,1,(KeyCnt%1000/100)+'0');
else LCD_Write_Char(11,1,'0');
if((KeyCnt%100)/10 >0)LCD_Write_Char(12,1,(KeyCnt%100)/10+'0');
else LCD_Write_Char(12,1,'0');
if(KeyCnt%10 >0)LCD_Write_Char(13,1,KeyCnt%10+'0');
else LCD_Write_Char(13,1,'0');
for(i=0;i<9;i++)
{ LCD_Write_Char(15,1,LCDBuffer3[i]);
DelaymS(30);
LCD_Write_Char(14,1,LCDBuffer4[j]);
if(j>5)j=0;
else j++;
}
}
}
六、实验总结
本次实验在LCD1液晶显示模块(LM016L)显示学号和拼音姓名,实现了按键查询,并在虚拟终端进行显示。

实验集合了之前众多的嵌入式知识,是对所学知识的综合运用。

因此要实现实验要求必须对以前的实验进行回顾和总结。

如今,嵌入式系统已经在众多电气电子产品上应用。

嵌入式是典型的交叉学科,电信、电子、电气、计算机、通信等等都有涉及。

嵌入式理论、实践要求多、门槛高,只有理论、实践同步才能在积累中更好的渐次掌握,这学期我们针对嵌入式入门做了一些实验,通过自己动手和实验软件打交道,对嵌入式编程形成初步了解,为今后进一步发展打基础。

学习嵌入式是一个漫长的过程,学好它还是需要一番的功夫。

通过嵌入式实验由浅入深的动手实践,我渐渐对嵌入式有了具体概念,也逐渐对其产生了兴致和好奇心。

对于初学者,还有一点小建议,不要好高骛远,要脚踏实地。

相关文档
最新文档