(完整版)基于stm32的LCD12864显示+16个矩阵键盘程序
#include "stm32f10x.h"
#define read_busybit() GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_7 )
#define DATAOUT GPIOC->ODR//
unsigned char table1[]={"65"};
unsigned char table2[]={"大学"} ;
unsigned char table3[]={"学院"} ;
unsigned char table4[]={"电子信息"} ;
unsigned char table5[]={"姓名"} ;
unsigned char hy5;
unsigned char k=0;
void delay(unsigned int x)
{
while(x--);
}
// 外设时钟使能
/*************************************************************************/
void RCC_Configuration(void) //在208页这里是引脚时钟配置
{
/* 使能外设时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 |
RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |
RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
}
/****************************************************************************** *
全部用到1602的引脚将在在配置
******************************************************************************* /
void GPIO_Configuration(void) // 1602引脚配置
GPIO_InitTypeDef GPIO_InitStructure;
/* LD1 & LD2 & LD3 & LD4 configration */
GPIO_InitStructure.GPIO_Pin
=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GP IO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//矩阵键盘引脚输出配置
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure );
//矩阵键盘引脚输入配置
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_11|GPIO_Pin_7|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
void key()//按键检测
{
unsigned char ii,jj;
unsigned int key[10][10];
u16 ling[]={GPIO_Pin_7,GPIO_Pin_6,GPIO_Pin_11,GPIO_Pin_13};
u16 heng[]={GPIO_Pin_0,GPIO_Pin_1,GPIO_Pin_2,GPIO_Pin_9};
GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_9);
for (ii=0;ii<4;ii++)
{
GPIO_ResetBits(GPIOB,heng[ii]);
for(jj=0;jj<4;jj++)
{
delay(50000);
delay(50000);
//delay(50000);
if(GPIO_ReadInputDataBit(GPIOB,ling[jj])==0)
{
while(GPIO_ReadInputDataBit(GPIOB,ling[jj]==0));
key[ii][jj]=1;
}
else
{
key[ii][jj]=0;
//delay(50000);
}
}
GPIO_SetBits(GPIOB,heng[ii]);
}
if((key[0][0]==1)&&(GPIO_ReadInputDataBit(GPIOB,ling[0])==1)){hy5=1;} //**** if((key[0][1]==1)&&(GPIO_ReadInputDataBit(GPIOB,ling[0])==1)){hy5=2;}
if((key[0][2]==1)&&(GPIO_ReadInputDataBit(GPIOB,ling[0])==1)){hy5=3;}
if((key[0][3]==1)&&(GPIO_ReadInputDataBit(GPIOB,ling[0])==1)){hy5=4;}
if((key[1][0]==1)&&(GPIO_ReadInputDataBit(GPIOB,ling[1])==1)){hy5=5;} //***
if((key[1][1]==1)&&(GPIO_ReadInputDataBit(GPIOB,ling[1])==1)){hy5=6;}
if((key[1][2]==1)&&(GPIO_ReadInputDataBit(GPIOB,ling[1])==1)){hy5=7;}
if((key[1][3]==1)&&(GPIO_ReadInputDataBit(GPIOB,ling[1])==1)){hy5=8;}
if((key[2][0]==1)&&(GPIO_ReadInputDataBit(GPIOB,ling[2])==1)){hy5=9;} //***** if((key[2][1]==1)&&(GPIO_ReadInputDataBit(GPIOB,ling[2])==1)){hy5=10;}
if((key[2][2]==1)&&(GPIO_ReadInputDataBit(GPIOB,ling[2])==1)){hy5=11;}
if((key[2][3]==1)&&(GPIO_ReadInputDataBit(GPIOB,ling[2])==1)){hy5=12;}
if((key[3][0]==1)&&(GPIO_ReadInputDataBit(GPIOB,ling[3])==1)){hy5=13;} //***** if((key[3][1]==1)&&(GPIO_ReadInputDataBit(GPIOB,ling[3])==1)){hy5=14;}
if((key[3][2]==1)&&(GPIO_ReadInputDataBit(GPIOB,ling[3])==1)){hy5=15;}
if((key[3][3]==1)&&(GPIO_ReadInputDataBit(GPIOB,ling[3])==1)){hy5=16;}
// hy2=9;
// return hy2;
//
}
void LCD_DataIo_In(void)//数据线输入1602 输入引脚配置
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPI O_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
}
void LCD_DataIo_Out(void)//数据线输出1602引脚输出配置
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPI O_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
}
void hy()
{
GPIO_ResetBits(GPIOE,GPIO_Pin_7);
GPIO_ResetBits(GPIOE,GPIO_Pin_6);
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
GPIO_ResetBits(GPIOE,GPIO_Pin_4);
GPIO_ResetBits(GPIOE,GPIO_Pin_3);
GPIO_ResetBits(GPIOE,GPIO_Pin_2);
GPIO_ResetBits(GPIOE,GPIO_Pin_1);
GPIO_ResetBits(GPIOE,GPIO_Pin_0);
}
void GPIO_Cofiguration_12864(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.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_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5 ;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
}
void LCD_12864_in(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.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_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void LCD_12864_out(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.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_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void readbusy_12864()
{
LCD_12864_in();
GPIO_ResetBits(GPIOD,GPIO_Pin_1); // rs
GPIO_SetBits(GPIOD,GPIO_Pin_2); // rw
GPIO_SetBits(GPIOD,GPIO_Pin_3); //en
while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7));
GPIO_ResetBits(GPIOD,GPIO_Pin_3);
LCD_12864_out();
}
void hy2()
{
GPIO_ResetBits(GPIOC,GPIO_Pin_0);
GPIO_ResetBits(GPIOC,GPIO_Pin_1);
GPIO_ResetBits(GPIOC,GPIO_Pin_2);
GPIO_ResetBits(GPIOC,GPIO_Pin_3);
GPIO_ResetBits(GPIOC,GPIO_Pin_4);
GPIO_ResetBits(GPIOC,GPIO_Pin_5);
GPIO_ResetBits(GPIOC,GPIO_Pin_6);
GPIO_ResetBits(GPIOC,GPIO_Pin_7);
}
/****************************************************************************** *
******************************************************************************* /
void NVIC_Configuration(void)
{
}
/****************************************************************************** *
初始化时钟晶振72MHZ
******************************************************************************* /
void SysClock_Init(void) //上半部分在196页
{
ErrorStatus HSEStartUpStatus;
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON); //这个函数表示选择外部晶振作为时钟源
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //
if(HSEStartUpStatus == SUCCESS){ //等待外部晶振起振
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//开打预取指缓存使能
FLASH_SetLatency(FLASH_Latency_2); //2延时周期。设一个flash的等待状态。时钟过快要在这里等待
RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置主时钟。设置AHB时钟(HCLK)AHB时钟=系统时钟
RCC_PCLK2Config(RCC_HCLK_Div1); // 设置高速的AHB时钟(PCLK2),APB2时钟=HCLK (RCC_HCLK_Div1)
RCC_PCLK1Config(RCC_HCLK_Div2); //设置低速的AHB时钟(PCLK1),AHB1时钟=HCLK/2
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);//PLL的输入时钟=HSE时钟频率(RCC_PLLSource_HSE_Div1),PLL输入时钟X9(RCC_PLLMul_9)//这里如果晶振是8MHZ时,RCC_PLLMul_9表示通过锁相环倍频9倍,此时晶振变为8MHZ*9=72MHZ,就变为72MHZ。此时主时钟就是72MHZ (RCC_HCLKConfig(RCC_SYSCLK_Div1); )
//此时上面的RCC_PCLK2Config(RCC_HCLK_Div1) 也为72MHZ,还有上面的RCC_PCLK1Config(RCC_HCLK_Div2);时钟就变为76MHZ/2=36MHZ
RCC_PLLCmd(ENABLE);// 使能或者失能PLL 在这里是使能
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){
//RCC_FLAG_PLLRDY是PLL就绪
;
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择PLL做为系统时钟(RCC_SYSCLKSource_PLLCLK)
while(RCC_GetSYSCLKSource() != 0x08){ //RCC_GetSYSCLKSource功能是返回用作系统时钟的时钟源,0x08表示PLL作为系统时钟
// ;
}
}
}
/******************************************
*
*
*
****************************************/
/****************************************************
读忙函数
****************************************************/
//unsigned char readbusy() //读忙函数
void readbusy()
{
//unsigned char result;
LCD_DataIo_In();
//GPIO_SetBits(GPIOE,GPIO_Pin_7);
GPIO_ResetBits(GPIOA,GPIO_Pin_1); //rs=0
GPIO_SetBits(GPIOA,GPIO_Pin_2); //rw=1
GPIO_SetBits(GPIOA,GPIO_Pin_3); //en=1
//delay(5000);
while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_7 ));
//result=read_busybit();
GPIO_ResetBits(GPIOA,GPIO_Pin_3); //en=0
//return result;
LCD_DataIo_Out();
}
void write_12864_cmd(unsigned char a11) //写指令
{
//while(readbusy()) ;
readbusy_12864() ;
hy2();
GPIO_ResetBits(GPIOD,GPIO_Pin_1); //rs=0
GPIO_ResetBits(GPIOD,GPIO_Pin_2); //rw=0
GPIO_ResetBits(GPIOD,GPIO_Pin_3);
//GPIO_ResetBits(GPIOA,GPIO_Pin_3);
delay(5000 );
DATAOUT=a11;
GPIO_SetBits(GPIOD,GPIO_Pin_3);//1
delay(5000 );
GPIO_ResetBits(GPIOD,GPIO_Pin_3); //0
}
void write_12864_data(unsigned char data11) //写数据{
//unsigned int j=256;
// while((readbusy())&&(j--));
// while(readbusy());
readbusy_12864();
hy2();
delay(5000 );
GPIO_ResetBits(GPIOD,GPIO_Pin_3);
GPIO_SetBits(GPIOD,GPIO_Pin_1) ; //rs=1
GPIO_ResetBits(GPIOD,GPIO_Pin_2);//rw=0
delay(5000 );
DATAOUT=data11;
GPIO_SetBits(GPIOD,GPIO_Pin_3);//1
delay(5000 );
GPIO_ResetBits(GPIOD,GPIO_Pin_3); //0
}
void init_12864()
{
//
GPIO_ResetBits(GPIOD,GPIO_Pin_5);//这是12864的复位键
//delay(5000 );
GPIO_SetBits(GPIOD,GPIO_Pin_4);
GPIO_SetBits(GPIOD,GPIO_Pin_5);
write_12864_cmd(0x30);
delay(5000 );
write_12864_cmd(0x30);
delay(5000 );
write_12864_cmd(0x30);
delay(5000 );
write_12864_cmd(0x06);
delay(5000 );
write_12864_cmd(0x01);
delay(5000 );
write_12864_cmd(0x0c);
delay(5000 );
//write_12864_cmd(0x02);
}
void weizhi_12864(unsigned char a1,unsigned char a2) {
unsigned char x;
if(a1==1)
{
a1=0x80;
}
else if(a1==2)
{
a1=0x90;
}
else if(a1==3)
{
a1=0x88;
}
else if(a1==4)
{
a1=0x98;
}
x=a1+a2;
write_12864_cmd(x) ;
}
void writeby(unsigned char a1,unsigned char a2)
{
readbusy();
hy();
GPIO_ResetBits(GPIOA,GPIO_Pin_1); //rs =0
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
if(a2==0)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1); //rs =0
GPIO_ResetBits(GPIOA,GPIO_Pin_2); //rw=0
}
if(a2==1)
{
GPIO_SetBits(GPIOA,GPIO_Pin_1); //rs=1
GPIO_ResetBits(GPIOA,GPIO_Pin_2); //rw=0 }
if(a1&0x80)
{
GPIO_SetBits(GPIOE,GPIO_Pin_7) ;
}
else
{
GPIO_ResetBits(GPIOE,GPIO_Pin_7);
}
if(a1&0x40)
{
GPIO_SetBits(GPIOE,GPIO_Pin_6) ; //等于1的意思}
else
{
GPIO_ResetBits(GPIOE,GPIO_Pin_6);
}
if(a1&0x20)
{
GPIO_SetBits(GPIOE,GPIO_Pin_5) ;
}
else
{
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
}
if(a1&0x10)
{
GPIO_SetBits(GPIOE,GPIO_Pin_4) ;
}
else
{
GPIO_ResetBits(GPIOE,GPIO_Pin_4);
}
GPIO_SetBits(GPIOA,GPIO_Pin_3);
delay(5000 );
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
hy();
if((a1<<4)&0x80)
{
GPIO_SetBits(GPIOE,GPIO_Pin_7) ;
}
else
{
GPIO_ResetBits(GPIOE,GPIO_Pin_7);
}
if((a1<<4)&0x40)
{
GPIO_SetBits(GPIOE,GPIO_Pin_6) ; //等于1的意思}
else
{
GPIO_ResetBits(GPIOE,GPIO_Pin_6);
}
if((a1<<4)&0x20)
{
GPIO_SetBits(GPIOE,GPIO_Pin_5) ;
}
else
{
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
}
if((a1<<4)&0x10)
{
GPIO_SetBits(GPIOE,GPIO_Pin_4) ;
}
else
{
GPIO_ResetBits(GPIOE,GPIO_Pin_4);
}
GPIO_SetBits(GPIOA,GPIO_Pin_3);
delay(5000 );
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
}
/********************************************************
1602的定义
********************************************************/ void init()
{
writeby(0x28,0);
writeby(0x28,0);
writeby(0x28,0);
writeby(0x01,0);
writeby(0x02,0);
writeby(0x0C,0);
writeby(0x06,0);
}
/******************************************************* MAIN 函数
*******************************************************/ int main(void)
{
// unsigned char pp=0;
SysClock_Init(); // 初始化系统时钟72MHZ
RCC_Configuration(); // 使能外设GPIO_Configuration(); // 配置引脚GPIO_Cofiguration_12864();
init();
delay(20000 );
writeby(0xc0,0);
delay(20000 );
writeby(0x30+1,1);
delay(40000);
k=0;
while(table1[k]!=0)
{
writeby(table1[k],1);
//Delay(2);
delay(5000 );
k++;
}
delay(10000 );
init_12864();
delay(20000 );
weizhi_12864(1,0);
delay(10000 );
k=0;
while(table2[k]!='\0')
{
write_12864_data(table2[k]);
delay(5000 );
k++;
}
delay(10000 );
weizhi_12864(2,0);
delay(10000 );
k=0;
while(table3[k]!='\0')
{
write_12864_data(table3[k]);
delay(5000 );
k++;
}
delay(10000 );
weizhi_12864(3,0);
delay(10000 );
k=0;
while(table4[k]!='\0')
{
write_12864_data(table4[k]);
delay(5000 );
k++;
}
delay(10000 );
weizhi_12864(4,0);
delay(10000 );
k=0;
while(table5[k]!='\0')
{
write_12864_data(table5[k]);
delay(5000 );
k++;
}
while(1)
{
//key();
key();//按键检测
//下面是lcd12864显示程序
writeby(0x80,0);
writeby(0x30+hy5/10,1);
writeby(0x30+hy5%10,1);
delay(60000);
delay(60000);
delay(60000);
}
}
(完整版)基于stm32的LCD12864显示+16个矩阵键盘程序的相关文档搜索
推荐阅读
- 滚丝机如何调试与使用
- 女王乔安经典语录
- 精编人教版七年级数学下册《算术平方根》教学设计
- 磁悬浮列车简介
- 串级控制系统设计及其仿真
- 股指期货自然人投资者适当性综合评估表3
- 连铸拉钢班长职位说明书.
- 2018年高考全国二卷文科数学试卷
- 领导讲话稿写作概要
- 基于ANSYS分析的塔机行走底架计算方法
- 丰田公司精益生产概述
- 如何写论文
- 德育工作总结汇总.doc
- 精品—数学顶尖课课练
- 2008年6月大学英语四级考试A卷真题答案与精解
- 2011-2012学年度第一学期期中七年级语文试卷
- 2014黑龙江省普通高中学业水平考试历史真题
- 部编版《道德与法治》七年级下册知识点归纳
- CISCO路由器配置手册(doc 93页)
- 防拐骗安全教育主题班会教学课件PPT模板
- 2016年版黄陂区重大招商引资项目策划咨询报告
- 节能环保型建筑设计和新材料的应用
- matlab试题标准答案-A
- 食品安全管理制度范本
- 最新高中英语必修二Unit4-知识点讲解及答案
- 中国财政体制改革的研究
- 华东理工大学有机化学单元测试答案