实验内容:
(1)默认在在OLED屏幕上分行显示自己的学号、姓名,如“2010011001”、“zhangsan”。
思路:RIT128x96x4StringDraw直接显示。
(2)按下键盘的任意键,在OLED屏幕正中显示该键字符,如“0”、“A”等。
思路:通过oledkey得到键盘的值,利用RIT128x96x4StringDraw显示在屏幕上。
(3)按下键盘的偶数键时,在OLED屏幕上显示“Now Show Char!”提示信息,并在OLED屏幕上显示实验一的字符,并根据按下的键值,确定字符的位置,按“0”、“2”、“4”、“6”、“8”、“A”、“C”、“E”分别在最左端,距左端1/8屏幕宽度处、距左端2/8屏幕宽度处、距左端3/8屏幕宽度处、距左端1/2屏幕宽度处、距右端3/8屏幕宽度处、距右端2/8屏幕宽度处、距右端1/8屏幕宽度处、最右端显示。要保证字符可以全部显示。
思路:通过switch语句进行判断,当键盘值为上述字符时调用Draw_Char_F(ulx)在相应位置显示字符图形。
(4)按下键盘的奇数键时,在OLED屏幕上显示“Now Reset Speed!”提示信息,在OLED屏幕上显示实验二的效果,即根据自己分配的阈值和移动路线上对字符进行移动,并根据按下的键值,确定频率的快慢,按“1”、“3”、“5”、“7”、“9”、“B”、“D”、“F”由慢到快(速度可以逐个递增2倍或5倍)。
思路:通过switch语句进行判断,当键盘值为上述字符时调用Reset_Counter_Speed(x)设置字符的不同移动速度。
(5)根据自己的想法,选用一个按键,在OLED屏幕上显示与上面不同的效果。
思路:一朵花从花盆中长出花茎、叶子、花朵。通过不同的按键长出花的不同部分。
实验步骤:
(一)Keil开发环境中对项目Project配置 见实验一(一)步骤 (二)嵌入式C程序开发 (1)加载必要程序
本次实验提供了几个源程序rit128x96x4.h,rit128x96x4.c,startup.s,都压在work3_code.zip中,与实验一(二)(1)步骤类似。
(2)新建主函数程序,并加载到项目中
新建一个文件,保存为main.c,把main.c也加载到项目中,与实验一(二)(2)步骤类似。 本次实验需要增加以下头文件 #include
#include
本次实验显示的内容实验(二)已完成,故可在实验(二)基础上进一步开发。
(3)利用中断,接收键盘输入
(3)--(1)在主函数中 开启键盘中断,示例如下: /*使能外设GPIO*/
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
/*设置GPIO为输入*/
GPIOPinTypeGPIOInput(GPIO_PORTD_BASE, GPIO_PIN_7); GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, GPIO_PIN_4);
/*使能中断*/
IntEnable(INT_GPIOD); IntMasterEnable();
GPIOPinIntEnable(GPIO_PORTD_BASE, GPIO_PIN_7); GPIOIntTypeSet(GPIO_PORTD_BASE, GPIO_RISING_EDGE);
GPIO_PIN_7,
注意:其中,GPIO_PORTC用于传输按下的键值,GPIO_PORTD用于向CPU发起中断请求。
(3)--(2)设置全局变量oledkey用于保存键盘输入的按键 char oledkey[2];
(3)--(3)设计实现并注册键盘中断处理函数
键盘每次按键都会触发四次中断,中断信号源为GPIO Port D,修改startup.s中GPIO Port D项对应的中断服务处理函数,与实验(二)设置中断流程类似,这里不再重复。
键盘中断处理函数示例如下:
int i=0; // i定义为全局变量,因为只有1根线GPIO_PIN_4与CPU相联,所以一个按键(16种,4bit表示)需要四次中断才能传给CPU。
unsigned char ucValue=0x00; //ucValue定义为全局变量,该值存储输入的按键值的中间结果。
/*中断服务函数ISR*/ void GPIO_PORT_D_ISR(void) {
unsigned char ucKey;
unsigned long ulStatus;
ulStatus = GPIOPinIntStatus(GPIO_PORTD_BASE, true); GPIOPinIntClear(GPIO_PORTD_BASE, ulStatus);
if(ulStatus & GPIO_PIN_7) {
ucKey = GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_4); ucKey = ucKey>>1;
ucValue = ucValue + ucKey; ucValue = ucValue<<1; i++; if(i==4) { i=0;
oledkey[1]='\\0'; if((ucValue>>4)<10)
oledkey[0] = (ucValue>>4) + 48; else
oledkey[0] = (ucValue>>4) - 10 + 'A'; } }